소프트 인 터 럽 트 문 제 를 기록 합 니 다.

5617 단어 Nginx。
며칠 전 XEN 가상 컴퓨터 의 Nginx 서버 에 문제 가 있 는 것 을 발견 했다. 소프트 인 터 럽 트 가 너무 높 고 대부분 같은 CPU 에 집중 되 어 있 으 며 시스템 이 바 쁘 면 이 CPU 는 나무통 의 단판 이 된다.
문제 서버 에서 "top"명령 을 실행 하면 "si"에 이상 이 있 음 을 뚜렷하게 볼 수 있 습 니 다. 대부분의 소프트 인 터 럽 트 는 1 번 CPU 에 집중 되 어 있 고 다른 CPU 는 전혀 힘 을 쓰 지 못 합 니 다.
shell> top
Cpu0: 11.3%us,  4.7%sy,  0.0%ni, 82.5%id,  ...  0.8%si,  0.8%st
Cpu1: 21.3%us,  7.4%sy,  0.0%ni, 51.5%id,  ... 17.8%si,  2.0%st
Cpu2: 16.6%us,  4.5%sy,  0.0%ni, 77.7%id,  ...  0.8%si,  0.4%st
Cpu3: 15.9%us,  3.6%sy,  0.0%ni, 79.3%id,  ...  0.8%si,  0.4%st
Cpu4: 17.7%us,  4.9%sy,  0.0%ni, 75.3%id,  ...  1.2%si,  0.8%st
Cpu5: 23.6%us,  6.6%sy,  0.0%ni, 68.1%id,  ...  0.9%si,  0.9%st
Cpu6: 18.1%us,  4.9%sy,  0.0%ni, 75.7%id,  ...  0.4%si,  0.8%st
Cpu7: 21.1%us,  5.8%sy,  0.0%ni, 71.4%id,  ...  1.2%si,  0.4%st

소프트 인 터 럽 트 관련 데 이 터 를 조회 해 보 니 주로 NET 에 집중 되 어 있 었 습 니 다.RX 에서 네트워크 카드 문제 로 추 정 됩 니 다.
shell> watch -d -n 1 'cat /proc/softirqs'
                CPU0       CPU1       CPU2 ...       CPU7
      HI:          0          0          0 ...          0
   TIMER: 3692566284 3692960089 3692546970 ... 3693032995
  NET_TX:  130800410  652649368  154773818 ...  308945843
  NET_RX:  443627492 3802219918  792341500 ... 2546517156
   BLOCK:          0          0          0 ...          0
BLOCK_IOPOLL:      0          0          0 ...          0
 TASKLET:          0          0          0 ...          0
   SCHED: 1518716295  335629521 1520873304 ... 1444792018
 HRTIMER:        160       1351        131 ...        196
     RCU: 4201292019 3982761151 4184401659 ... 4039269755

홈 호스트 를 조회 하 였 는데, 네트워크 카드 가 단일 대기 열 모드 에서 실행 되 고 있 음 을 발견 하 였 습 니 다.
shell> grep -A 10 -i network /var/log/dmesg
Initalizing network drop monitor service
Intel(R) Gigabit Ethernet Network Driver - version 3.0.19
igb 0000:05:00.0: Intel(R) Gigabit Ethernet Network Connection
igb 0000:05:00.0: eth0: (PCIe:2.5GT/s:Width x4) 00:1b:21:bf:b3:2c
igb 0000:05:00.0: eth0: PBA No: G18758-002
igb 0000:05:00.0: Using MSI-X ... 1 rx queue(s), 1 tx queue(s)
igb 0000:05:00.1: Intel(R) Gigabit Ethernet Network Connection
igb 0000:05:00.1: eth1: (PCIe:2.5GT/s:Width x4) 00:1b:21:bf:b3:2d
igb 0000:05:00.1: eth1: PBA No: G18758-002
igb 0000:05:00.1: Using MSI-X ... 1 rx queue(s), 1 tx queue(s)

이어서 네트워크 카드 의 인 터 럽 트 번 호 를 확인 해 보 세 요. 단일 대기 열 이기 때문에 인 터 럽 트 번호 가 45:
살펴보다    훨씬
shell> grep eth /proc/interrupts | awk '{print $1, $NF}'
45: eth0

네트워크 카드 의 인 터 럽 트 번 호 를 알 면 친연 성 설정 'smp affinity' 를 조회 할 수 있 습 니 다.
shell> cat /proc/irq/45/smp_affinity
02

여기 02 는 실제 16 진법 으로 1 번 CPU 를 나타 내 고 계산 방법 은 다음 과 같다 (참고 자료).
          Binary       Hex 
  CPU 0    0001         1 
  CPU 1    0010         2
  CPU 2    0100         4
+ CPU 3    1000         8
  -----------------------
  both     1111         f

설명: 4 개의 CPU 가 인 터 럽 트 처리 에 참여 하면 f 로 설정 합 니 다.같은 이유 로 8 개의 CPU 를 ff 로 설정 합 니 다.
shell> echo ff > /proc/irq/45/smp_affinity

그리고 "smp affinity list"와 유사 한 설정 이 있 습 니 다.
shell> cat /proc/irq/45/smp_affinity_list
1

두 설정 은 서로 통 합 됩 니 다. 하 나 를 수정 하면 다른 하 나 는 변 합 니 다.그러나 'smp affinity list' 는 10 진법 을 사용 합 니 다. 'smp affinity' 의 16 진법 에 비해 가 독성 이 좋 습 니 다.
이러한 기본 지식 을 알 게 되면 우 리 는 CPU 를 바 꾸 어 무슨 일이 일어 날 지 시험 해 볼 수 있다.
echo 7 > /proc/irq/45/smp_affinity_list

'top' 명령 을 통 해 살 펴 보면 소프트 인 터 럽 트 를 처리 하 는 CPU 가 7 번 CPU 로 변 한 것 을 발견 할 수 있 습 니 다.
설명: 여러 개의 CPU 가 중단 처리 에 참여 하 기 를 원한 다 면 다음 과 같은 문법 을 사용 할 수 있 습 니 다.
echo 3,5 > /proc/irq/45/smp_affinity_list
echo 0-7 > /proc/irq/45/smp_affinity_list

나 쁜 메 시 지 는 단일 대기 열 네트워크 카드 에 있어 서 'smp affinity' 와 'smp affinity list' 설정 이 다 중 CPU 가 잘못 되 었 습 니 다.
좋 은 소식 은 Linux 가 RPS 를 지원 하 는 것 이다. 통속 적 으로 소프트웨어 차원 에서 하드웨어 를 모 의 하 는 다 중 대기 열 네트워크 카드 기능 이다.
우선 RPS 를 설정 하 는 방법 을 살 펴 보 겠 습 니 다. CPU 개수 가 8 개 라면 ff 로 설정 할 수 있 습 니 다.
shell> echo ff > /sys/class/net/eth0/queues/rx-0/rps_cpus

이 어 커 널 파라미터 rps 설정sock_flow_entries (공식 문서 추천 설정: 32768):
shell> sysctl net.core.rps_sock_flow_entries=32768

마지막 설정 rpsflow_cnct, 단일 대기 열 네트워크 카드 는 rps 로 설정sock_flow_entries 하면 됩 니 다:
echo 32768 > /sys/class/net/eth0/queues/rx-0/rps_flow_cnt

설명: 다 중 대기 열 네트워크 카드 라면 대기 열 수량 에 따라 rps 로 설정 합 니 다.sock_flow_entries/N .
위 와 같은 최 적 화 를 한 후에 'top' 명령 을 실행 하면 소프트 인 터 럽 트 가 두 개의 CPU 로 분 산 된 것 을 볼 수 있 습 니 다.
shell> top
Cpu0: 24.8%us,  9.7%sy,  0.0%ni, 52.2%id,  ... 11.5%si,  1.8%st
Cpu1:  8.8%us,  5.1%sy,  0.0%ni, 76.5%id,  ...  7.4%si,  2.2%st
Cpu2: 17.6%us,  5.1%sy,  0.0%ni, 75.7%id,  ...  0.7%si,  0.7%st
Cpu3: 11.9%us,  7.0%sy,  0.0%ni, 80.4%id,  ...  0.7%si,  0.0%st
Cpu4: 15.4%us,  6.6%sy,  0.0%ni, 75.7%id,  ...  1.5%si,  0.7%st
Cpu5: 20.6%us,  6.9%sy,  0.0%ni, 70.2%id,  ...  1.5%si,  0.8%st
Cpu6: 12.9%us,  5.7%sy,  0.0%ni, 80.0%id,  ...  0.7%si,  0.7%st
Cpu7: 15.9%us,  5.1%sy,  0.0%ni, 77.5%id,  ...  0.7%si,  0.7%st

의문: 이론 적 으로 저 는 RPS 를 ff 로 설 치 했 습 니 다. 모든 8 개의 CPU 가 함께 소프트 인 터 럽 트 를 분담 해 야 합 니 다. 그러나 실제 결 과 는 두 가지 뿐 입 니 다. 이 유 를 아 시 는 분 은 가르쳐 주 십시오. 하지만 아무래도 두 가 지 는 하나 가 좋 습 니 다.
또한 이것 은 Nginx 서버 이기 때문에 'worker cpu affinity' 명령 을 통 해 Nginx 가 어떤 CPU 를 사용 하 는 지 설정 할 수 있 습 니 다. 그러면 우 리 는 높 은 부하 CPU 를 돌아 성능 에 도움 이 될 것 입 니 다.
보충: 서버 가 NUMA 구조 라면 'numactl – cpubind' 도 유용 할 수 있 습 니 다.
마지막 으로 허브 가 정리 한 소프트 인 터 럽 트 에 관 한 자료 와 도 구 를 살 펴 보 는 것 을 추천 합 니 다. 전면적 입 니 다.

좋은 웹페이지 즐겨찾기