소프트 인 터 럽 트 문 제 를 기록 합 니 다.
5617 단어 Nginx。
문제 서버 에서 "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' 도 유용 할 수 있 습 니 다.
마지막 으로 허브 가 정리 한 소프트 인 터 럽 트 에 관 한 자료 와 도 구 를 살 펴 보 는 것 을 추천 합 니 다. 전면적 입 니 다.