セグフォルト競合状態のデバッグ

セグフォルト競合状態のデバッグ

次のような出力を提供する競合状態をトリガーできます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、、、、、、、)が作成されました。sortmd5sumbashpastewc

この問題が私のラップトップと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。これにより、エラーをすばやく見つけることができます。

関連情報