어떤 작업이 Linux에서 많은 컨텍스트 스위치를 생성하는지 확인하십시오.


11

vmstat에 따르면 내 Linux 서버 (2xCore2 Duo 2.5GHz)는 초당 약 20k 컨텍스트 전환을 지속적으로 수행하고 있습니다.

# vmstat 3
procs -----------memory----------  ---swap-- -----io----  -system-- ----cpu----
 r  b   swpd   free   buff  cache    si   so    bi    bo   in    cs us sy id wa
 2  0   7292 249472  82340 2291972    0    0     0     0    0     0  7 13 79  0
 0  0   7292 251808  82344 2291968    0    0     0   184   24 20090  1  1 99  0
 0  0   7292 251876  82344 2291968    0    0     0    83   17 20157  1  0 99  0
 0  0   7292 251876  82344 2291968    0    0     0    73   12 20116  1  0 99  0

...하지만 uptime쇼 작은 부하 : load average: 0.01, 0.02, 0.01top높은 %의 CPU 사용률이 어떤 과정을 표시하지 않습니다.

해당 컨텍스트 스위치를 정확히 생성하는 것을 어떻게 알 수 있습니까? 어떤 프로세스 / 스레드?

pidstat출력 을 분석하려고했습니다 .

# pidstat -w 10 1

12:39:13          PID   cswch/s nvcswch/s  Command
12:39:23            1      0.20      0.00  init
12:39:23            4      0.20      0.00  ksoftirqd/0
12:39:23            7      1.60      0.00  events/0
12:39:23            8      1.50      0.00  events/1
12:39:23           89      0.50      0.00  kblockd/0
12:39:23           90      0.30      0.00  kblockd/1
12:39:23          995      0.40      0.00  kirqd
12:39:23          997      0.60      0.00  kjournald
12:39:23         1146      0.20      0.00  svscan
12:39:23         2162      5.00      0.00  kjournald
12:39:23         2526      0.20      2.00  postgres
12:39:23         2530      1.00      0.30  postgres
12:39:23         2534      5.00      3.20  postgres
12:39:23         2536      1.40      1.70  postgres
12:39:23        12061     10.59      0.90  postgres
12:39:23        14442      1.50      2.20  postgres
12:39:23        15416      0.20      0.00  monitor
12:39:23        17289      0.10      0.00  syslogd
12:39:23        21776      0.40      0.30  postgres
12:39:23        23638      0.10      0.00  screen
12:39:23        25153      1.00      0.00  sshd
12:39:23        25185     86.61      0.00  daemon1
12:39:23        25190     12.19     35.86  postgres
12:39:23        25295      2.00      0.00  screen
12:39:23        25743      9.99      0.00  daemon2
12:39:23        25747      1.10      3.00  postgres
12:39:23        26968      5.09      0.80  postgres
12:39:23        26969      5.00      0.00  postgres
12:39:23        26970      1.10      0.20  postgres
12:39:23        26971     17.98      1.80  postgres
12:39:23        27607      0.90      0.40  postgres
12:39:23        29338      4.30      0.00  screen
12:39:23        31247      4.10     23.58  postgres
12:39:23        31249     82.92     34.77  postgres
12:39:23        31484      0.20      0.00  pdflush
12:39:23        32097      0.10      0.00  pidstat

일부 postgresql 작업이 초당> 10 컨텍스트 컨텍스트를 수행하는 것처럼 보이지만 어쨌든 모두 최대 20k가되는 것은 아닙니다.

답을 좀 더 깊이 파는 방법을 알고 있습니까?


postgre에 관한 것은 그것들이 완전히 다른 프로그램이므로 완전히 다릅니다.
Gopoi

답변:


5

글쎄, 아주 흥미로운 경우입니다. 관찰 해보십시오 watch -tdn1 cat /proc/interrupts. 거기에 귀중한 변화가 있습니까?


"로컬 타이머 인터럽트"는 각 CPU 코어에서 수백 (200-800) 개의 인터럽트를 생성합니다. 그게 무슨 뜻이야? 또한 eth0-rx / tx는 해당 서버의 트래픽으로 인해 인터럽트를 생성하지만 그다지 많지 않습니다.
grzaks

"함수 호출 인터럽트"는 어떻습니까?
poige

10

사용해보십시오

pidstat -wt

't'옵션은 스레드도 보여줍니다. 컨텍스트 전환을 수행하는 스레드 일 수 있습니다.


1
pidstat -wt 실행 | sort -n -k4가 좋습니다.
Ismael Vacco

2

최신 커널 버전

sudo perf record -e context-switches -a  # record the events

# then ctrl+c

sudo perf report # inspect the result

이를 통해 컨텍스트 전환 이벤트에 대한 정확한 결과를 얻을 수 있습니다.

그리고 "-g"플래그를 추가하여 컨텍스트 전환의 원인을 찾을 수 있습니다 (기호 정보에 의해 결정된 읽기 결과)

sudo perf record -e context-switches -a -g

1

상황 전환은 정상입니다. 프로세스가 완료되어야하는 경우 (또는 리소스 필요로 인해 일시 중지 된 경우) 프로세스가 처리량을 할당 할 수 있도록 처리량을 할당합니다.

그것은 얼마나 많은 컨텍스트 전환이 수행되었는지를 계산하기 위해 (스택 오버 플로우 .com 답변이 됨) 프로세스 테이블에 쓰는 내부 커널 schedule () 명령이 필요합니다. A 자신의 커널을 프로그래밍하면 볼 수는 없지만 매우 어렵습니다.


1
잘. 컨텍스트 전환이 무엇이고 시스템 성능에 미치는 영향을 알고 있습니다. 나는 리눅스에서 어떤 프로세스에 컨텍스트 스위치가 얼마나 많은지를 측정하는 방법이 필요하다. 이미 / proc / * / stats (voluntary_ctxt_switches)에서 원시 csw 카운터를 찾았습니다
grzaks

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.