mirror of
https://github.com/agessaman/MeshCore.git
synced 2026-07-12 13:08:48 +00:00
46041130b6
- Added `getQueueSize` method to `MyMesh` and `CommonCLI` for better queue management. - Introduced memory logging functionality in `MQTTBridge` to monitor heap usage and detect potential memory leaks. - Adjusted maximum queue size in `MQTTBridge` from 50 to 10 for improved resource management. - Enhanced command handling in `CommonCLI` to report memory status upon request.
195 lines
5.0 KiB
Markdown
195 lines
5.0 KiB
Markdown
# MeshCore Memory Monitoring Guide
|
|
|
|
## Quick Start
|
|
|
|
### 1. Find Your Device Port
|
|
```bash
|
|
# Linux/macOS
|
|
ls /dev/tty* | grep -E "(USB|ACM)"
|
|
|
|
# Common ports:
|
|
# /dev/ttyUSB0 - Linux USB serial
|
|
# /dev/ttyACM0 - Linux USB CDC
|
|
# /dev/cu.usbserial-* - macOS USB serial
|
|
# /dev/cu.usbmodem* - macOS USB CDC
|
|
```
|
|
|
|
### 2. Run Monitoring
|
|
```bash
|
|
# Monitor for 4 hours (default)
|
|
python3 monitor_memory.py /dev/ttyUSB0
|
|
|
|
# Monitor for 24 hours
|
|
python3 monitor_memory.py /dev/ttyUSB0 24
|
|
|
|
# Monitor for 2 hours with 60-second intervals
|
|
python3 monitor_memory.py /dev/ttyUSB0 2 --interval 60
|
|
```
|
|
|
|
## What It Monitors
|
|
|
|
### Memory Metrics
|
|
- **Free Heap**: Available memory in bytes
|
|
- **Min Heap**: Minimum free heap since boot
|
|
- **Max Alloc**: Largest allocatable block
|
|
- **Queue Size**: Number of queued MQTT packets
|
|
|
|
### Calculated Metrics
|
|
- **Heap Usage %**: Percentage of total memory used
|
|
- **Fragmentation %**: How fragmented the heap is
|
|
|
|
### Automatic Alerts
|
|
- **LOW_MEMORY**: Free heap < 50KB
|
|
- **HIGH_FRAGMENTATION**: Fragmentation > 50%
|
|
- **QUEUE_BUILDUP**: Queue size > 20 packets
|
|
- **POSSIBLE_LEAK**: Memory decreasing over time
|
|
|
|
## Output Files
|
|
|
|
### Console Output
|
|
```
|
|
[ 30.0m] Free: 102796, Min: 83544, Max: 75764, Queue: 0, Usage: 68.6%, Frag: 26.3%
|
|
[ 60.0m] Free: 101234, Min: 82345, Max: 74321, Queue: 2, Usage: 69.1%, Frag: 26.5%
|
|
⚠️ WARNING: HIGH_FRAGMENTATION
|
|
```
|
|
|
|
### CSV Log File
|
|
```csv
|
|
Timestamp,Elapsed_Minutes,Free_Heap,Min_Heap,Max_Alloc,Queue_Size,Heap_Usage_Percent,Fragmentation_Percent
|
|
2024-01-15T10:30:00,0.0,102796,83544,75764,0,68.6,26.3
|
|
2024-01-15T11:00:00,30.0,101234,82345,74321,2,69.1,26.5
|
|
```
|
|
|
|
## Understanding Results
|
|
|
|
### Healthy System
|
|
- **Free Heap**: 150KB+ (stable)
|
|
- **Min Heap**: 120KB+ (stable)
|
|
- **Max Alloc**: 100KB+ (stable)
|
|
- **Fragmentation**: < 30%
|
|
- **Queue**: 0-10 packets
|
|
|
|
### Warning Signs
|
|
- **Free Heap**: < 100KB or decreasing
|
|
- **Min Heap**: < 80KB or decreasing
|
|
- **Fragmentation**: > 50%
|
|
- **Queue**: > 20 packets consistently
|
|
|
|
### Memory Leak Indicators
|
|
- **Consistent decrease** in Free Heap over time
|
|
- **Min Heap dropping** below previous minimums
|
|
- **Max Alloc shrinking** (fragmentation increasing)
|
|
- **POSSIBLE_LEAK** alert triggered
|
|
|
|
## Long-Term Monitoring
|
|
|
|
### 24-Hour Test
|
|
```bash
|
|
python3 monitor_memory.py /dev/ttyUSB0 24
|
|
```
|
|
- Tests for memory leaks over extended period
|
|
- Monitors system stability under normal load
|
|
- Identifies gradual memory degradation
|
|
|
|
### 48-Hour Stress Test
|
|
```bash
|
|
python3 monitor_memory.py /dev/ttyUSB0 48 --interval 60
|
|
```
|
|
- Extended monitoring for critical deployments
|
|
- 60-second intervals reduce log file size
|
|
- Tests system under continuous operation
|
|
|
|
## Troubleshooting
|
|
|
|
### Device Not Responding
|
|
1. Check port is correct: `ls /dev/tty*`
|
|
2. Ensure device is connected and powered
|
|
3. Try different baud rate if needed
|
|
4. Check device is in correct mode
|
|
|
|
### No Data in CSV
|
|
1. Verify device responds to `memory` command manually
|
|
2. Check serial connection is stable
|
|
3. Ensure device has MQTT bridge enabled
|
|
|
|
### High Memory Usage
|
|
1. Check if it's stable or increasing
|
|
2. Look for memory leak patterns
|
|
3. Monitor queue size for packet buildup
|
|
4. Consider reducing debug logging
|
|
|
|
## Analysis Tools
|
|
|
|
### Plot Memory Usage
|
|
```python
|
|
import pandas as pd
|
|
import matplotlib.pyplot as plt
|
|
|
|
# Load CSV data
|
|
df = pd.read_csv('memory_monitor_20240115_103000.csv')
|
|
|
|
# Plot memory over time
|
|
plt.figure(figsize=(12, 8))
|
|
plt.subplot(2, 2, 1)
|
|
plt.plot(df['Elapsed_Minutes'], df['Free_Heap'])
|
|
plt.title('Free Heap Over Time')
|
|
plt.ylabel('Bytes')
|
|
|
|
plt.subplot(2, 2, 2)
|
|
plt.plot(df['Elapsed_Minutes'], df['Heap_Usage_Percent'])
|
|
plt.title('Heap Usage Percentage')
|
|
plt.ylabel('%')
|
|
|
|
plt.subplot(2, 2, 3)
|
|
plt.plot(df['Elapsed_Minutes'], df['Fragmentation_Percent'])
|
|
plt.title('Heap Fragmentation')
|
|
plt.ylabel('%')
|
|
|
|
plt.subplot(2, 2, 4)
|
|
plt.plot(df['Elapsed_Minutes'], df['Queue_Size'])
|
|
plt.title('Queue Size')
|
|
plt.ylabel('Packets')
|
|
|
|
plt.tight_layout()
|
|
plt.savefig('memory_analysis.png')
|
|
plt.show()
|
|
```
|
|
|
|
### Check for Trends
|
|
```python
|
|
# Calculate memory trend
|
|
df['Free_Heap_Trend'] = df['Free_Heap'].rolling(window=10).mean()
|
|
df['Trend_Slope'] = df['Free_Heap_Trend'].diff()
|
|
|
|
# Identify decreasing trends
|
|
decreasing = df[df['Trend_Slope'] < -1000]
|
|
if not decreasing.empty:
|
|
print("Memory decreasing trend detected!")
|
|
print(decreasing[['Elapsed_Minutes', 'Free_Heap', 'Trend_Slope']])
|
|
```
|
|
|
|
## Best Practices
|
|
|
|
1. **Start with 4-hour baseline** to establish normal patterns
|
|
2. **Monitor during peak usage** times for worst-case scenarios
|
|
3. **Run 24-hour tests** before production deployment
|
|
4. **Check logs regularly** for warning signs
|
|
5. **Keep historical data** for trend analysis
|
|
6. **Test after code changes** to verify fixes
|
|
|
|
## Emergency Procedures
|
|
|
|
### If Memory Leak Detected
|
|
1. **Stop monitoring** (Ctrl+C)
|
|
2. **Check recent code changes**
|
|
3. **Look for unfreed allocations**
|
|
4. **Test with reduced functionality**
|
|
5. **Deploy memory leak fix**
|
|
|
|
### If System Crashes
|
|
1. **Check last known good memory values**
|
|
2. **Identify crash threshold**
|
|
3. **Add more frequent monitoring**
|
|
4. **Implement memory safeguards**
|
|
5. **Consider hardware upgrade**
|