시스템에서 수신된 모든 MP-TCP 패킷에 대한 일부 추가 정보를 dmesg 및 syslog(printk 사용)에 인쇄하는 사용자 정의 Linux 커널이 있습니다. 모든 것이 완벽하게 작동하지만 ( iperf
도구를 사용하여) 매우 많은 수의 패킷에 해당하는 약 2Gbps의 데이터를 생성하고 있습니다 . 내 시스템의 모든 CPU는 printk로 인해 100% 로드되었습니다(CPU는 4개입니다). 이것이 내 시스템의 패킷 처리에 영향을 미치고 추가적인 문제와 지연을 일으킬 수 있다는 점이 걱정됩니다. 그래서 내 질문은 CPU 부하를 늘리지 않고 Liunx 커널에 데이터를 저장하는 다른 방법이 있습니까?
데이터 크기의 예를 들면, 60초 iperf 세션의 경우 `/var/log/syslog 크기는 약 1.2GB입니다.
한 가지 덧붙이자면, 보고된 데이터를 Linux 커널을 통해 온라인 방식으로 처리할 필요가 없습니다. 오프라인 모드에서 작업하겠습니다.
답변1
아마 확인해 봐야 할 것 같아요길, 내장 Linux 커널 추적 도구. 예를 들어 이것은 약간 구식입니다.그린넷 기사설명하다
Ftrace는 다음과 같은 새로운 형태의 printk()를 도입했습니다.추적 인쇄(). printk()처럼 사용하거나 모든 컨텍스트(인터럽트 코드, NMI 코드 및 스케줄러 코드)에서 사용할 수 있습니다. 무슨 좋은추적 인쇄()예, 콘솔에 출력되지 않습니다. 대신 Ftrace 링 버퍼에 쓰고 추적 파일에서 읽을 수 있습니다. Trace_printk()를 사용하여 링 버퍼에 쓰는 데는 약 10분의 1초밖에 걸리지 않습니다.
예를 들어, 커널이나 모듈에 다음과 같은 것을 추가할 수 있습니다.
trace_printk("read foo %d out of bar %p\n", bar->foo, bar);
이것커널 문서 ftrace.txt세부 사항이 있습니다. 디렉토리에서 /sys/kernel/debug/tracing/
의사 파일의 추적 링 버퍼 크기를 설정할 수 있습니다 buffer_size_kb
.