次のような出力を提供する競合状態をトリガーできます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を実行しているので、次のステップは別のカーネルを実行することです。おそらくDebianや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
。これにより、エラーをすばやく見つけることができます。