Files
StreamLens/debug_background_timing.py

119 lines
4.8 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python3
"""Debug background analyzer timing processing"""
import sys
sys.path.append('.')
from analyzer.analysis import EthernetAnalyzer
from analyzer.utils import PCAPLoader
from analyzer.analysis.background_analyzer import BackgroundAnalyzer
import time
def debug_background_timing(pcap_file, src_ip="192.168.4.89"):
"""Debug timing in background processing"""
print("=== DEBUGGING BACKGROUND TIMING ===")
# Test 1: Single-threaded background analyzer
print("\n1. Single-threaded background analyzer:")
analyzer1 = EthernetAnalyzer(enable_realtime=False, outlier_threshold_sigma=3.0)
bg_analyzer1 = BackgroundAnalyzer(analyzer1, num_threads=1) # Single thread
bg_analyzer1.start_parsing(pcap_file)
while bg_analyzer1.is_parsing:
time.sleep(0.1)
flow1 = None
for flow_key, flow in analyzer1.flows.items():
if flow.src_ip == src_ip:
flow1 = flow
break
if flow1:
print(f" Packets: {flow1.frame_count}")
print(f" Inter-arrival count: {len(flow1.inter_arrival_times)}")
print(f" Avg ΔT: {flow1.avg_inter_arrival * 1000:.3f} ms")
print(f" Std σ: {flow1.std_inter_arrival * 1000:.3f} ms")
ch10_data_outliers = len(flow1.frame_types.get('CH10-Data', type('', (), {'outlier_frames': []})).outlier_frames)
print(f" CH10-Data outliers: {ch10_data_outliers}")
# Test 2: Multi-threaded background analyzer (default)
print("\n2. Multi-threaded background analyzer:")
analyzer2 = EthernetAnalyzer(enable_realtime=False, outlier_threshold_sigma=3.0)
bg_analyzer2 = BackgroundAnalyzer(analyzer2, num_threads=4) # Multi thread
bg_analyzer2.start_parsing(pcap_file)
while bg_analyzer2.is_parsing:
time.sleep(0.1)
flow2 = None
for flow_key, flow in analyzer2.flows.items():
if flow.src_ip == src_ip:
flow2 = flow
break
if flow2:
print(f" Packets: {flow2.frame_count}")
print(f" Inter-arrival count: {len(flow2.inter_arrival_times)}")
print(f" Avg ΔT: {flow2.avg_inter_arrival * 1000:.3f} ms")
print(f" Std σ: {flow2.std_inter_arrival * 1000:.3f} ms")
ch10_data_outliers = len(flow2.frame_types.get('CH10-Data', type('', (), {'outlier_frames': []})).outlier_frames)
print(f" CH10-Data outliers: {ch10_data_outliers}")
# Test 3: Batch processing (reference)
print("\n3. Batch processing (reference):")
analyzer3 = EthernetAnalyzer(enable_realtime=False, outlier_threshold_sigma=3.0)
loader = PCAPLoader(pcap_file)
packets = loader.load_all()
for i, packet in enumerate(packets, 1):
analyzer3._process_single_packet(packet, i)
analyzer3.calculate_statistics()
flow3 = None
for flow_key, flow in analyzer3.flows.items():
if flow.src_ip == src_ip:
flow3 = flow
break
if flow3:
print(f" Packets: {flow3.frame_count}")
print(f" Inter-arrival count: {len(flow3.inter_arrival_times)}")
print(f" Avg ΔT: {flow3.avg_inter_arrival * 1000:.3f} ms")
print(f" Std σ: {flow3.std_inter_arrival * 1000:.3f} ms")
ch10_data_outliers = len(flow3.frame_types.get('CH10-Data', type('', (), {'outlier_frames': []})).outlier_frames)
print(f" CH10-Data outliers: {ch10_data_outliers}")
print(f"\n=== TIMING COMPARISON ===")
if flow1 and flow2 and flow3:
print(f"Single-thread BG: Avg={flow1.avg_inter_arrival * 1000:.6f}ms, Std={flow1.std_inter_arrival * 1000:.6f}ms")
print(f"Multi-thread BG: Avg={flow2.avg_inter_arrival * 1000:.6f}ms, Std={flow2.std_inter_arrival * 1000:.6f}ms")
print(f"Batch: Avg={flow3.avg_inter_arrival * 1000:.6f}ms, Std={flow3.std_inter_arrival * 1000:.6f}ms")
# Check if multithreading is the issue
if abs(flow1.std_inter_arrival - flow3.std_inter_arrival) < 0.001:
print("\n✅ Single-threaded matches batch - multithreading is the issue!")
elif abs(flow2.std_inter_arrival - flow3.std_inter_arrival) < 0.001:
print("\n✅ Multi-threaded matches batch - no threading issue")
else:
print("\n⚠️ Neither background method matches batch processing")
# Check for packet order issues
print(f"\n=== PACKET ORDER CHECK ===")
if flow3:
print("First 10 packet timestamps (batch):")
for i, ts in enumerate(flow3.timestamps[:10]):
print(f" [{i}] {ts:.6f}")
if flow2:
print("First 10 packet timestamps (background):")
for i, ts in enumerate(flow2.timestamps[:10]):
print(f" [{i}] {ts:.6f}")
if __name__ == "__main__":
if len(sys.argv) > 1:
debug_background_timing(sys.argv[1])
else:
debug_background_timing("1 PTPGM.pcapng")