SMP를 사용했을 경우 network 성능이 향상되나요?

albamc의 이미지

안녕하세요.

linux kernel을 이용한 packet forwarding 장비를 개발하고 있는데요.

kernel을 SMP로 컴파일하고 NIC driver를 SMP로 컴파일해서

SMP용 모듈을 적재해서 시험해보니 오히려 성능이 저하되어서 난감합니다.

2.4대 커널이어서 network receive가 softirq로 처리되어서

성능이 향상될것이라고 생각했는데요... 실제로 그러한지 확인이 안되네요.

SMP를 사용할경우 해주어야 할 일들이 더 많이 있는지 모르겠네요.

SMP를 사용해서 실제로 성능이 향상된 (network 성능) 예가 있는지 궁금합니다.

Necromancer의 이미지

다중프로세서와 연관된 기능입니다. 프로세서 하나만 쓴다면 필요 없습니다.

만일 프로세서 하나인 시스템에 SMP를 쓰게 된다면 SMP 관련된 부분이

불필요하게 들어가기 때문에 성능이 떨어질 수밖에 없습니다.

Written By the Black Knight of Destruction

ifyou의 이미지

흑기사 wrote:

만일 프로세서 하나인 시스템에 SMP를 쓰게 된다면

프로세서가 두개 이상이면 어떻게 되나요?

저도 예전에 linux kernel을 수정해서 packet forwarding 장비

만들려고 한적있었는데, 프로젝트가 취소되어 버렸죠~

octo16의 이미지

제가 만든 packet forwarding module은 CPU에 많이 영향을 받던데요.

albamc의 이미지

당연히! CPU는 2개 입니다...

커널과 NIC 모듈도 SMP로 compile 해주었구요.

NIC는 intel Gigabit ethernet card를 사용하구요.

질문이 좀 애매 했는데 ... 제가 궁금한것은

SMP 일 경우에 NIC의 Hardware Interrupt 처리 용량이 늘어나는지와

software interrupt 처리 능력이 늘어나는지 입니다.

octo16님께서 성능에 영향을 많이 받는다고 하셨는데

어떤 장비를 사용하셨는지 궁금하네요...

단순 forwarding인지 아니면 뭔가 작업을(CPU를 많이 사용하는) 하고 forwarding인지도 궁금하구요...

제가 쓰는 장비는 IBM x330 에 듀얼 P3 1.4G CPU가 장착되어 잇고
Intel Gigabit Ethernet card가 4개 장착되어 있거든요...

궁금한게 너무 많네요...T_T

^^*

mach의 이미지

* 참고
SMP의 경우, 커널과 유저쓰레드가 각각 별개의 프로세서로 스케쥴링됩니다.
CPU가 하나라면, 단일 CPU에서 처리가 이뤄져야하기 때문에, SMP보다는
성능이 안나올것이라는 생각을 해볼 수 있습니다.
SMP를 사용하고 성능이 나아지는것을 보려면, 아마도, 다음과 같은 시나리오도
고려해 보셔야 할 듯합니다.

Quote:
- 유저쓰레드와 커널쓰레드(NI 디바이스 드라이버등)의 처리병렬성은?
- 유저쓰레드가 다수개이며 프로세싱이 많은가?
- 혹시, 유저 쓰레드는 단일 CPU건 SMP건 프로세싱타임이 차이가 없는가?
- 만일 이러하다면, 오히려 SMP의 메모리 및 버스 사용에 걸리는 스위칭
오버헤드만이 발생하지 않을까?
기본적으로 커널이 유저쓰레드를 처리하는데 시간을 분배할 수 있을것이므로
다소 빨라짐이 맞는것 같습니다.

------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.

kldpdais의 이미지

윗분 말대로 라면, forwarding은 CPU가 2개라면 별 도움이 되지 않을거 같은데요.
forwarding은 kernel 모드에서 동작되는데, 2개를 구별해서 CPU가 처리한다면, 1개나 2개나 크게 성능 향상은 없겠군요.
또한 패킷이 들어 왔을때 병렬로 처리하도록 프로그래밍하지 않는다면, CPU가 4개가 되더라도 크게 성능 향상이 있을것 같지도 않군요.
맞나요? ^^;

albamc의 이미지

2.4 kernel이므로 network packet receive에 softirq를 사용하며

softirq는 병렬로 처리되는것으로 알고 있습니다.

제가 만든 커널 모듈로 패킷이 들어왔을때 smp_processor_id()를 해보면

2개의 CPU를 돌아가면서 쓰는게 보이구요.

hardware interrupt 를 처리하는데 SMP라고 해서 늘어나지 않는것 같기도 하고

SMP하면 그냥 성능이 증가할줄 알았는데 큰 착오였네요 ...

정말 난감합니다... T_T

^^*

seongju의 이미지

확신할 수 없지만 SMP에서 성능관련 하여 많이 발생하는 문제가 IRQ 처리에 관련된 것이라고 합니다.

예를들어 SMP인데도 불구하고 IRQ 처리를 하나의 CPU만이 담당하거나 하는문제들이죠.

그래서 성능관련 자료에 보면 많이 나오는 말이 CPU Affinity 입니다. 즉 필요한 IRQ 를 CPU별로 고정적으로 잘 분산하여 주는 것입니다.

커널 문서에 IRQ-affinity.txt 라는 문서가 있습니다.
혹시 관련이 있을지 모르니 한번 참고하시고 IO-APIC.txt 파일도 참고해 보세요.

예전에 기가비트 IDS를 만들면서 이런 문제로 고민한 적이 있다는 말은 들은 적이 있습니다.

또 네트워크 성능 벤치마크 할 경우에도 NIC를 시스템에 몇개씩 장착하여 테스트 하는데 그냥 장착하는게 아니라 SMP라면 반드시 이부분에 대한 설정을해준다는 내용이 있습니다. 자료에 대한 정확한 URL은 당장 기억나진 않네요.

참고가 되셨으면 합니다.

octo16의 이미지

정확히 말하면 SMP에 영향을 많이 받는다고 보기는 힘듭니다.
그보다는 개별 CPU 성능에 더 큰 영향을 받는것 같습니다.
itanium2 900MHz 4-Way Server에서 packet forwarding을 할 때, 100Mbps를 최대로 사용할 경우
CPU Load가 하나의 CPU에서만 10~15% 정도 발생했습니다.

Intel Pro 1000 NIC을 사용했지만, Gigabit 스위치가 없어서
100Mbps 까지만 테스트했습니다.

albamc의 이미지

답변 감사합니다...

여기저기 찾아보고 결론을 내린게 ...

저의 상황에서는 SMP로는 성능향상을 기대하기 어렵다는 것입니다.

우선 O(1) scheduler란 것을 처음 봤는데요.
(누가 인터넷에서 현재 커널의 scheduler가 SMP에서 비효율적이기때문에
O(1) scheduler를 써야 한다고 하더군요.)

현재 2.4 버젼에는 포함되어 있지 않고 2.5대 커널에는 포함되어 있는것 같더군요.

그렇지만 ac patch를 해서 O(1) scheduler를 적용해도 성능향상이 없었는데요... :? (비슷하게까지는 만들었습니다.... :cry: )

성능향상이 없는 가장 큰이유가 NIC의 interrupt를 CPU에 배분하는 방법이

비효율적이어서 그런것 같더군요.

실제 측정해본 결과로도 거의 하나의 CPU가 대부분 처리하구요

NEC의 연구원들의 자료에 의하면 SMP에 의한 성능향상이 intel pentium 3계열에서는 30%정도고

itinium 쪽은 오히려 성능이 저하되는것으로 보고하고 있습니다.

제가 만든 모듈에서 측정한 결과로는 locking을 사용하지 않은 코드와

사용한 코드간에 약 10% ~ 20% 정도 성능 차이가 있었는데

이렇게 보면 성능이 향상되지 않는게 당연할것 같더군요.

NIC의 hardware interrupt를 CPU별로 binding 시켜주면 성능이

향상된다는 말이 있었는데 이부분은 그럴것 같기도 한데

전 조금더 조사해 보고 싶기는 한데 상관의 명령으로 여기서 접기로 했습니다...

그동안 SMP로 시간을 너무 많이 써서 미안하기도 하고 해서요.

나중에 시간나면 좀더 테스트해볼려구요.

답글 올려주신 님들께 감사드립니다... (--)(__)(--)

ps.
100Mbps NIC면 병목지점이 CPU가 아니라 NIC이기 때문에 SMP로 성능향상은 안될것 같네요... 그리고 알려주신 커널 문서 읽어봐야 겠네요... 좋은 정보 감사드립니다!

^^*

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.