2013-01-24 4 views
-1

두 개의 스레드가있는 응용 프로그램이 있는데 thread1이 네트워크 카드 eth1에서 멀티 캐스트 패키지 을 받았다면 sched_setaffinity를 사용하여 CPU 선호도를 설정하는 데 을 할당 한 다음 thread2를 사용하여 이 패키지를 사용합니다. (힙 영역의 전역 변수에있는 thread1에서 수신) 일부 작업을 수행하려면 코어 1과 코어 7이 하이퍼 스레딩을 사용하는 동일한 코어에 인 것으로 가정하고 thread2에 대한 CPU 친 화성을 코어 7로 설정한다고 가정하십시오. 코어 1과 코어 7이 L1 캐시를 사용할 수 있기 때문에 성능이 좋을 것이라고 생각합니다 ( ).리눅스에서 네트워크 성능 튜닝

나는/proc 디렉토리/인터럽트가, 것 내가, 내가, thread1 핵심 1 CPU 선호도를 설정 eth1를 내 경우에 그렇게 여러 CPU 코어에 을 인터럽트를 가지고 볼 수 있지만 인터럽트가 많은 코어에
무슨 일이 있었 효과를 본 성능? eth1 에서받은 패키지는 어떤 코어가 인터럽트를 가지고 있더라도 직접 메인 메모리로 이동합니까?

리눅스 커널에 대한 네트워크에 대해 잘 모릅니다. 도서 또는 웹 사이트에서이 주제에 대해 도움을 줄 수있는 사람이 있습니까? 의견 ~

편집 주셔서 감사합니다 "모든 프로그래머가 메모리에 대해 알아야 할 사항"에 따라 6.3.5는 "직접 캐시 액세스가"나는 "DCA"생각 나는 알고 싶다 hwat입니다 ...

답변

1

인터럽트는 패킷을받는 코어와 다른 코어에서 발생합니다. 운전자가 패킷을 다루는 방법에 따라 중요 할 수도 있고 중요하지 않을 수도 있습니다. 드라이버가 패킷을 읽으면 (예 : 복사본을 만드십시오), 캐시가 다른 CPU에서 채워지는 것이 이상적이지 않습니다. 그러나 패킷이 DMA를 사용하여 어딘가에 메모리에로드되고 나중에 픽업 할 수 있도록 남겨두면 문제가되지 않습니다 [실제로는 다른 CPU에서 "사용자"의 CPU로 발생하는 것이 좋습니다 다른 일을 할 수있는 더 많은 시간을 얻는다].

하이퍼 스레딩을 사용할 때 내 경험 (다른 많은 기능)은 하이퍼 스레딩 (hyperthreading)이 이점을 제공하지만 두 스레드가 동일한 코어의 동일한 실행 단위를 사용하기 때문에 하이퍼 스레딩을 사용하지 않는 것과 유사합니다 . 동일한 코어에서 선호도로 설정된 두 스레드의 처리량을 비교하여 "좋음"또는 "나쁨"인지 확인합니다. 대부분의 경우와 마찬가지로 차이를 만드는 세부 정보이므로 코드가 누군가 다른 사람과 약간 다르므로, 그 중 하나 또는 다른 경우에 더 잘 작동합니다.

편집 : 시스템에 여러 개의 소켓이있는 경우 소켓의 CPU가 QPI/PCI 브리지 홉 수와 같이 네트워크 카드에 가장 가까운 지 확인하십시오.

+0

고맙습니다. Mats, 내 서버는 하이퍼 스레딩 기능이있는 6 코어, 12 유닛으로 구성되어 있습니다. 물어봐도 될까요, 어떻게 네트 카드 사용 DMA 여부를 확인할 수 있습니까? 그 패킷이 DMA를 사용한다면, 모든 패킷이 메인 메모리로 직접 이동하게되므로,이 경우 패킷은 메인 moery에로드되고 코어 1 (core 1) 캐시를 실행하는 thread1로 이동합니다. – barfatchen

+0

정확히 어떻게 작동하는지 알지 못합니다 (드라이버의 소스 코드를 보지 않고). 하지만 대부분의 카드는 CPU를 사용하지 않고 메모리에 직접 쓸 것입니다. 즉, 캐시에 이미있는 데이터를 덮어 쓰는 데이터가 들어올 때 캐시 라인이 무효화된다는 것만 알 수 있습니다. 주 메모리는 "코어 당"이 아니므로 스레드가 실행중인 코어가 패킷 처리 중일 때 관련 데이터로 캐시를 채 웁니다. –