다음과 유사한 출력을 제공하는 경쟁 조건을 트리거할 수 있습니다 dmesg
.
[ 5432.541379] perl[408327]: segfault at 22 ip 0000564eb8af9cc2 sp 00007ffec318cea0 error 6 in perl[564eb8af7000+1a1000]
[ 5432.541402] Code: 83 f8 05 0f 87 cf 00 00 00 0f b7 6b 22 66 81 fd 00 04 77 64 01 ed 8d 7d 05 48 63 ff 48 c1 e7 03 be 01 00 00 00 e8 4e ef ff ff <66> 89 68 22 48 89 c3 66 89 68 24 4c 89 68 08 49 8b 45 00 48 89 03
[ 5432.541638] Core dump to |/usr/share/apport/apport pipe failed
[ 5432.660093] perl[408400]: segfault at 22 ip 00005654e7ec3cc2 sp 00007ffe47312cc0 error 6
[ 5432.660106] perl[408415]: segfault at 22 ip 000055b15d088cc2 sp 00007ffe67124210 error 6
[ 5432.660119] in perl[5654e7ec1000+1a1000]
[ 5432.660131] in perl[55b15d086000+1a1000]
[ 5432.660133] Code: 83 f8 05 0f 87 cf 00 00 00 0f b7 6b 22 66 81 fd 00 04 77 64 01 ed 8d 7d 05 48 63 ff 48 c1 e7 03 be 01 00 00 00 e8 4e ef ff ff <66> 89 68 22 48 89 c3 66 89 68 24 4c 89 68 08 49 8b 45 00 48 89 03
[ 5432.660142] Code: 83 f8 05 0f 87 cf 00 00 00 0f b7 6b 22 66 81 fd 00 04 77 64 01 ed 8d 7d 05 48 63 ff 48 c1 e7 03 be 01 00 00 00 e8 4e ef ff ff <66> 89 68 22 48 89 c3 66 89 68 24 4c 89 68 08 49 8b 45 00 48 89 03
[ 5432.660221] sleep[408436]: segfault at 0 ip 00007f18c67150b2 sp 00007ffdaf402820 error 4 in ld-linux-x86-64.so.2[7f18c66fa000+2a000]
[ 5432.660248] Code: 00 00 00 00 00 0f 1f 00 41 55 48 8d 05 50 1e 01 00 49 89 f5 49 89 c9 41 54 49 89 d4 48 89 c2 48 81 ec 18 04 00 00 85 ff 75 53 <41> 80 7d 00 00 48 8d 0d 2b 1e 01 00 4c 8d 05 d4 11 01 00 4c 0f 44
[ 5432.660417] Core dump to |/usr/share/apport/apport pipe failed
[ 5432.660480] Core dump to |/usr/share/apport/apport pipe failed
[ 5432.660543] Core dump to |/usr/share/apport/apport pipe failed
[ 5432.660593] perl[408406]: segfault at 22 ip 000055d5887c3cc2 sp 00007ffcf1af5220 error 6 in perl[55d5887c1000+1a1000]
[ 5432.660629] Code: 83 f8 05 0f 87 cf 00 00 00 0f b7 6b 22 66 81 fd 00 04 77 64 01 ed 8d 7d 05 48 63 ff 48 c1 e7 03 be 01 00 00 00 e8 4e ef ff ff <66> 89 68 22 48 89 c3 66 89 68 24 4c 89 68 08 49 8b 45 00 48 89 03
[ 5432.660888] Core dump to |/usr/share/apport/apport pipe failed
[ 5432.661682] perl[408391]: segfault at 22 ip 00005645d25a8cc2 sp 00007ffc836eb8b0 error 6 in perl[5645d25a6000+1a1000]
[ 5432.661718] Code: 83 f8 05 0f 87 cf 00 00 00 0f b7 6b 22 66 81 fd 00 04 77 64 01 ed 8d 7d 05 48 63 ff 48 c1 e7 03 be 01 00 00 00 e8 4e ef ff ff <66> 89 68 22 48 89 c3 66 89 68 24 4c 89 68 08 49 8b 45 00 48 89 03
[ 5432.661969] Core dump to |/usr/share/apport/apport pipe failed
[ 5433.228271] perl[408513]: segfault at 22 ip 000055bc88f1bcc2 sp 00007ffc31bb1ab0 error 6 in perl[55bc88f19000+1a1000]
[ 5433.228302] Code: 83 f8 05 0f 87 cf 00 00 00 0f b7 6b 22 66 81 fd 00 04 77 64 01 ed 8d 7d 05 48 63 ff 48 c1 e7 03 be 01 00 00 00 e8 4e ef ff ff <66> 89 68 22 48 89 c3 66 89 68 24 4c 89 68 08 49 8b 45 00 48 89 03
[ 5433.306971] perl[408642]: segfault at 22 ip 000055e76e66dcc2 sp 00007ffd37469c20 error 6 in perl[55e76e66b000+1a1000]
[ 5433.306999] Code: 83 f8 05 0f 87 cf 00 00 00 0f b7 6b 22 66 81 fd 00 04 77 64 01 ed 8d 7d 05 48 63 ff 48 c1 e7 03 be 01 00 00 00 e8 4e ef ff ff <66> 89 68 22 48 89 c3 66 89 68 24 4c 89 68 08 49 8b 45 00 48 89 03
[ 5433.307203] Core dump to |/usr/share/apport/apport pipe failed
[ 5433.820922] perl[408816]: segfault at 20 ip 0000557b90fb3463 sp 00007ffcd78bb6f0 error 4 in perl[557b90f88000+1a1000]
[ 5433.820953] Code: 89 df e8 60 9a 0e 00 48 8b 83 e0 00 00 00 48 8b 40 10 48 8b 13 48 85 c0 0f 85 79 ff ff ff e8 44 fc 06 00 48 8b 83 e0 00 00 00 <83> 78 20 00 79 2d 83 7b 30 00 7f 1b 48 8b bb f8 02 00 00 48 83 3f
[ 5433.821219] Core dump to |/usr/share/apport/apport pipe failed
( sleep
어떻게 모든 프로그램이 세그폴트가 가능합니까?!)
나는 때때로 컴퓨터의 다른 프로그램을 종료하는 것을 경험했습니다.
불행히도 경쟁 조건을 생성하는 프로그램은 상당히 큽니다.https://git.savannah.gnu.org/cgit/parallel.git/tree/testsuite/tests-to-run/parallel-local-30s.sh) 경쟁 조건을 제거하지 않고는 더 작게 만들 수 없습니다.
테스트에서는 총 10,000개 이상의 통신 perl
프로세스 + 일반 쉘 프로그램( sleep
, sort
, md5sum
, bash
, paste
, wc
)이 생성되었습니다.
이 문제가 내 노트북과 512GB 서버에서 재현될 수 있는지 테스트했습니다(따라서 RAM 오류, 과열 또는 메모리 부족 등으로 인해 발생하는 것은 아닙니다).
이것을 어떻게 디버깅하고 관련된 사람들에게 적합한 버그 보고서로 바꾸나요? (누가 관련되어 있습니까? 둘 다 세그폴트라면 perl
커널 sleep
에 경쟁 조건이 있을 수 있습니까? 아니면 bash에 있습니까? 아니면 libc에 있습니까?)
편집하다
FreeBSD12(Vagrant)가 설치되어 있습니다. 그리고 테스트는 FreeBSD12에서 완벽하게 실행됩니다. 이것은 커널이 범인이라고 생각하게 만듭니다. Vagrant가 어떻게든 FreeBSD12의 실패를 방지할 수도 있습니다.
노트북과 서버 모두 Ubuntu 22.04를 실행하고 있으므로 다음 단계는 다른 커널을 실행해 보는 것입니다. 어쩌면 데비안이나 CentOS일 수도 있습니다. Vagrant에서 Ubuntu22.04가 실패하면 나도 시도해 봐야 합니다.
적용 대상: FreeBSD12(Vagrant), Centos8(Vagrant), Ubuntu20.04(Vagrant), Ubuntu22.04(노트북), Ubuntu22.10(Vagrant).
실패: Ubuntu22.04(노트북 a, 서버 r).
내가 범인을 찾았을 수도 있습니다:
echo 2 > /proc/sys/vm/overcommit_memory
내가 이렇게 하면:
echo 0 > /proc/sys/vm/overcommit_memory
서버 r에서는 경쟁 조건이 사라집니다.
그런데 이러한 오류의 원인은 정확히 무엇입니까?
편집하다
Marcus는 이것이 메모리 할당과 관련이 있을 수 있다고 생각합니다. 실행 중에 다른 프로세스가 종료되는 것을 보면 보통 "xmalloc: 할당할 수 없습니다"라는 메시지가 나타납니다.약간의바이트".
이 이론이 올바른지 어떻게 테스트합니까?
답변1
ps aux
테스트 중 실행하면 다음 줄이 표시됩니다.
tange 1471203 0.0 0.0 264173920 3776 pts/1 T 20:54 0:00 sort --buffer-size=50% -k3r
264173920은 500GB의 50%이며 그 중 20개가 있습니다.
메모리 메시지는 다음과 같이 말합니다.
$ grep Committ /proc/meminfo
Committed_AS: 5291525876 kB
따라서 500GB이면 충분하다는 나의 가정은 잘못된 것입니다.
삭제하면 다음이 --buffer-size=50%
제공됩니다.
$ grep Committ /proc/meminfo
Committed_AS: 45391448 kB
그리고 문제없이 테스트가 완료되었습니다 /proc/sys/vm/overcommit_memory=2.
전체적으로 이것은 대부분의 상황을 설명합니다. 실행은 sort --buffer-size=50%
많은 (가상) 메모리를 소비하고 overcommit_memory=2에서는 가상 메모리를 사용할 수 있어야 하므로 다른 프로세스에 더 이상 사용할 수 있는 메모리가 없습니다.
overcommit_memory=0이면 메모리를 사용할 필요가 없으므로 실패가 발생하지 않습니다(소량의 메모리만 사용하므로).
이제 다음을 통해 이 문제를 유발할 수 있습니다.
parallel '(seq {};sleep 10) | sort --buffer-size=50%' ::: {1..20}
sort
그러나 왜 불평하지 않거나 sort: memory exhausted
나타나지 않는지 짜증이 납니다 dmesg
. 이렇게 하면 오류를 더 빨리 찾을 수 있습니다.