Improving Passive Packet Capture
오늘 연구소에서 나올 때 집어들고 나와서 재미있게 봤당. ㅋㅋ
링 버퍼와 rtirq를 조합해서 패킷 로스를 확 줄인 내용.
보면서 느낀 것은 옛날 리눅스 네트웍 성능 정말 개판이었구나 (..)
읽기 귀찮을 분들을 위해 간추려서 설명하면..
고속 네트웍에서는 패킷 들어올 때마다 메모리 할당 노가다 하느라고 비용이 많이 드는데, 커다란 버퍼를 하나 만들어놓고 돌려가면서 덮어쓰기만 하는 버퍼를 링 버퍼라고 말합니다. 일반적인 어플리케이션이라면 처리할 때까지 커널 큐에서 관리를 해야되지만, 네트워크 모니터링, 침입 탐지 등의 특수한 응용에서는 불필요한 메모리 할당을 제거하고 성능을 끌어올리기 위해 링 버퍼를 씁니다. 링 버퍼를 쓰면 유저스페이스에서 처리 속도가 못 따라가는 경우, 덮어쓰기가 발생하므로 패킷 로스가 발생하게 됩니다.
오늘 연구소에서 나올 때 집어들고 나와서 재미있게 봤당. ㅋㅋ
링 버퍼와 rtirq를 조합해서 패킷 로스를 확 줄인 내용.
보면서 느낀 것은 옛날 리눅스 네트웍 성능 정말 개판이었구나 (..)
읽기 귀찮을 분들을 위해 간추려서 설명하면..
- 폴링 전혀 안 쓰면 인터럽트 처리만 하다가 CPU 새 된다.
- 폴링 쓰면 훨 낫지만 여전히 패킷 로스가 많이 난다.
- mmap 쓰고 링 버퍼를 굴리면 일단 패킷 로스가 현격히 줄어든다.
- CPU 남아도는 상황에서도 패킷 로스가 나는 괴현상이 발생하는데, 그 이유는 poll 호출 비용이 꽤 커서 그새 들어오는 패킷은 로스난다는 것이다.
- 따라서 rtirq로 우선순위를 주면 패킷 로스가 거의 없어진다.
- 그러나 이러면 커널 패치를 해야되니 귀찮다. 어댑티브 폴링을 해서 패치 없이 어느 정도 해결할 수 있다.
고속 네트웍에서는 패킷 들어올 때마다 메모리 할당 노가다 하느라고 비용이 많이 드는데, 커다란 버퍼를 하나 만들어놓고 돌려가면서 덮어쓰기만 하는 버퍼를 링 버퍼라고 말합니다. 일반적인 어플리케이션이라면 처리할 때까지 커널 큐에서 관리를 해야되지만, 네트워크 모니터링, 침입 탐지 등의 특수한 응용에서는 불필요한 메모리 할당을 제거하고 성능을 끌어올리기 위해 링 버퍼를 씁니다. 링 버퍼를 쓰면 유저스페이스에서 처리 속도가 못 따라가는 경우, 덮어쓰기가 발생하므로 패킷 로스가 발생하게 됩니다.




덧글
merius 2008/04/08 17:59 # 삭제 답글
저기서 말하는 링버퍼가 어디 있는거야?
xeraph 2008/04/08 18:01 # 답글
드라이버가 mmap으로 잡고 userspace로 넘김.. 근데 나도 코드를 안 봐서리 험..