`cat /proc/$pid/cmdline`은 왜 몇 초가 걸리나요?

`cat /proc/$pid/cmdline`은 왜 몇 초가 걸리나요?

어제 우리 서버 중 하나에서 이상한 동작이 발생했습니다. ps, pgrep매우 htop느립니다(시작 시). )가 일부 프로세스에서 몇 초 정도 소요됨을 strace ps나타냅니다 . read('/proc/$pid/cmdline왜 이런 일이 발생합니까?

몇 가지 관찰 사항:

  • 프로세스 실행 파일은 NFS에 있습니다.
  • 프로세스(약 20개 이상)도 NFS에서 파일을 병렬로 실행 unlink및 운영하고 있습니다.symlink
  • 동일한 상위 프로세스에서 분기되었습니다.
  • 사용 가능한 RAM은 80GB(대부분 캐시)이지만 스왑 영역(4GB만)은 완전히 사용됩니다.
  • 예인 경우 실행 while true; do cat /proc/$pid/status; sleep .1; done한 다음 cat즉시 반환하지만 예인 경우 몇 초가 걸렸습니다.StateSRStateD

나는 인터넷 검색을 했고 Stateyes 일 때 D읽기가 /proc/$pid/cmdline중지된다는 답변을 찾았습니다. 정말? 어떻게 작동하나요? /proc/$pid/cmdline프로그램이 시작되기 전에 설정된 내용이 프로그램이 시작된 후 수행된 작업에 영향을 받는 이유는 무엇입니까 ?

답변1

또한 여기서 특수한 $pid를 얻기 위해 /proc/$pid/cmdline을 읽는 것은 State가 R인 경우에도 매우 느립니다. NUMA와 관련이 있을 수 있다는 점을 지적한 위의 링크 덕분에 numad가 프로세스를 노드에서 노드로 이동하여 발생했다는 것을 알게 되었습니다. 이는 /var/log/numad.log에서 가져온 것입니다.

Thu Jul 18 20:06:41 2019: Advising pid 9565 ($name) move from nodes (0-1) to nodes (1)
Thu Jul 18 20:06:45 2019: PID 9565 moved to node(s) 1 in 3.91 seconds
Thu Jul 18 20:11:50 2019: Advising pid 9565 ($name) move from nodes (1) to nodes (1)
Thu Jul 18 20:12:00 2019: PID 9565 moved to node(s) 1 in 9.72 seconds
Thu Jul 18 20:17:05 2019: Advising pid 9565 ($name) move from nodes (1) to nodes (1)
Thu Jul 18 20:17:23 2019: PID 9565 moved to node(s) 1 in 17.85 seconds
Thu Jul 18 20:22:28 2019: Advising pid 9565 ($name) move from nodes (1) to nodes (1)
Thu Jul 18 20:22:51 2019: PID 9565 moved to node(s) 1 in 22.73 seconds
Thu Jul 18 20:27:56 2019: Advising pid 9565 ($name) move from nodes (1) to nodes (1)
Thu Jul 18 20:28:23 2019: PID 9565 moved to node(s) 1 in 26.88 seconds
Thu Jul 18 20:33:28 2019: Advising pid 9565 ($name) move from nodes (1) to nodes (1)
Thu Jul 18 20:33:44 2019: PID 9565 moved to node(s) 1 in 15.49 seconds

프로세스를 이동할 때 cmdline을 읽는 속도가 느립니다. 왜냐하면 cmdline은 사용자 공간에서 가져오고 커널은 페이지를 잠그고 읽어야 하기 때문입니다.

프로세스 9565가 노드 1에 있지만 원격 메모리를 사용할 수 있으므로 나중에 동일한 노드 1에서 노드 1로 이동해야 할 것 같습니다.

% numactl -s
policy: default
preferred node: current
physcpubind: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
cpubind: 0 1
nodebind: 0 1
membind: 0 1

감사해요.

관련 정보