오늘 블로그를 돌다가 Xeraph 님의 블로그에서 재미있는 글을 봤습니다. “인텔 기가비트 NIC의 성능 향상 기법”이라는 내용이었는데, 원문은 http://xeraph.egloos.com/4808876 에서 보실 수 있습니다.

내용을 간단히 요약하자면 기가 비트쯤 되면 초당 무시무시한 패킷이 오고 가는데, 이것을 패킷이 올 때마다 인터럽트를 발생하게 하여 처리하면 인터럽트 처리의 오버 헤드 때문에 시스템의 전체적인 효율이 떨어진다는 것입니다. 어차피 패킷은 주기적으로 들어온다고 가정하면 인터럽트가 아닌 타이머를 사용할 수 있고, 주기적으로 패킷을 한꺼번에 읽도록 하면 효율을 높일 수 있다는 내용입니다.

실제로도 인터럽트가 자주 발생하면 현재 수행 중인 컨텍스트를 저장하고 복원하는 오버 헤드 때문에, 시스템의 성능이 급격히 떨어지게 됩니다. 저도 그런 경험을 한번 했었는데, 이 글을 읽고 나니 번뜩 떠오르더군요. 예전에 2003년쯤 자작한 kkama OS를 구동시키기 위해 펜티엄 2 233Mhz를 가진 노트북을 샀었습니다. Dell사 꺼였는 데, 플로피 디스크를 내장하고 있었기 때문에 상당히 메리트가 있었지요. ㅎㅎ

OS를 만들면서 GUI도 갖다 붙이고, HDD도 갖다 붙이고 하다가 장난 삼아(?) 시리얼 포트 드라이버를 만들 때였습니다. 전송 속도를 115200으로 맞춰 놓고 PC에서 노트북으로 데이터를 전송했더니, 정상적으로 패킷이 수신되지 않는 문제가 발생했습니다. 이상하다 싶어서 전송하는 동안 아무런 작업을 하지 않았더니 제대로 수신되더군요.

몇 번을 반복한 결과 시리얼로 패킷이 전송되는 동안 OS가 비정상적으로 느려지고, 마우스와 키보드, 그리고 HDD의 인터럽트, 그리고 인터럽트 불가 지역을 동시 다발적으로 수행할 때 패킷이 빠진다는 것을 알았습니다. 순진하게 시리얼 포트의 인터럽트가 발생할 때 마다 패킷 하나씩만 읽어 가서 FIFO에 남은 패킷이 계속 인터럽트를 유발했던 것이지요. 그러다 보니 처리가 늦어지고  패킷은 FIFO에서 밀려 사라지고... 등등의 문제가 발생했었습니다.

해결 방안은 간단했습니다. 시리얼 포트의 FIFO 크기를 늘리고, 인터럽트가 발생했을 때 마다 FIFO에 있는 데이터를 모두 읽음으로써 인터럽트의 발생 회수를 줄인 것입니다. 더불어 인터럽트 불가 영역을 줄여서 인터럽트에 좀더 빨리 반응하도록 한 것도 도움이 됐습니다.

안 그래도 지금 OS를 새로 만들고 있는데, 이런 점을 고려해서 잘 만들어야겠다는 생각이 드는군요. 그 동안 잊고 있었는데, 이점을 고려하면서 해야 할 것 같습니다.

에궁... 그럼 이만 또 자야겠네요. ㅎㅎ 다들 좋은 밤 되세요 ;)

+ Recent posts