私のアプリケーションはLinux上でバックグラウンドプロセスとして動作します。現在ターミナルウィンドウのコマンドラインで起動されています。
最近、ユーザーがしばらくアプリケーションを実行していて、それが不思議にも死にました。テキスト
殺された
端末にあった。これは2回起こりました。別のターミナルの誰かがkillコマンドを使ってプロセスを強制終了するかどうか尋ねましたか?いいえ.
どのような条件下でLinuxは自分のプロセスを終了させることにしますか?プロセスはkill(9)シグナルを受け取った後に死んだので、シェルは "kill"と表示したと思います。 Linuxがkillシグナルを送信した場合、システムログのどこかにメッセージが表示されます。これはなぜ強制終了されたのかを説明していますか?
ユーザーまたはsysadminがカーネルが持っている可能性があるプログラムを強制終了しなかった場合。カーネルは極端なリソース不足のような例外的な状況下でのみプロセスを強制終了します(mem + swapの枯渇を考えてください)。
試してください:
dmesg -T| grep -E -i -B100 'killed process'
-B100
は強制終了するまでの行数を表します。
Mac OSでは -T を省略してください。
これは主題に関するよい記事のように見えます: OOMキラーの調教 。
要点は、Linuxの が memoryをオーバーコミットすることです。プロセスがより多くのスペースを要求するとき、たとえそれが他のプロセスによって要求されていたとしても、誰も実際に彼らが要求するすべてのメモリを使用しないという仮定の下で、Linuxはそのスペースをそれに与えます。プロセスは、要求したときではなく、実際に使用したときに割り当てられたメモリを排他的に使用します。これにより割り当てが早くなり、実際よりも多くのメモリを "カンニング"して割り当てることができます。しかしながら、いったんプロセスがこのメモリを使い始めると、Linuxはそれが持っていないメモリを割り当てることにおいてあまりにも寛大過ぎたことを理解するかもしれず、そしていくらか解放するためにプロセスを殺さなければならないでしょう。殺されるプロセスは、ランタイムを考慮したスコア(長期実行プロセスのほうが安全です)、メモリ使用量(欲張りプロセスは安全性が低い)、およびプロセスを少なくするために調整できる値を含むその他のいくつかの要因に基づきます。殺される可能性があります。それはすべての記事でもっと詳細に説明されています。
編集:そしてここに もう一つの記事 はプロセスがどのように選択されるかをかなりよく説明しています(いくつかのカーネルコードの例で注釈が付けられています)。これに関して素晴らしいことは、さまざまなbadness()
ルールの背後にある 推論 に関するいくつかの解説が含まれていることです。
512 RAM + 1GBのスワップメモリがあるとします。理論的には、CPUは合計1.5GBの仮想メモリにアクセスできます。
今、しばらくの間、すべてが1.5GBの総メモリの範囲内で問題なく動作しています。しかし、突然(または徐々に)あなたのシステムはますます多くのメモリを消費し始め、それは使用された全メモリの約95%のポイントに達しました。
どのプロセスもカーネルから大量のメモリを要求したとします。カーネルは利用可能なメモリをチェックし、それがあなたのプロセスにより多くのメモリを割り当てることができる方法がないことを見つけます。そのため、OOMKillerを呼び出し/呼び出してメモリを解放しようとします( http://linux-mm.org/OOM )。
OOMKillerは各プロセスのランクをスコア付けするための独自のアルゴリズムを持っています。通常、どのプロセスがより多くのメモリを使用するかは、犠牲になることになります。
通常は/ var/logディレクトリにあります。 /var/log/kern.logまたは/ var/log/dmesgのいずれか
これがお役に立てば幸いです。
これがLinuxです メモリ不足マネージャ(OOM) 。あなたのプロセスは ' 悪さ ' - 最近のもの、常駐サイズ(割り当てられたばかりのメモリではなく使用中のメモリ)、その他の要素の組み合わせによって選択されました。
Sudo journalctl -xb
次のようなメッセージが表示されます。
Jul 20 11:05:00 someapp kernel: Mem-Info:
Jul 20 11:05:00 someapp kernel: Node 0 DMA per-cpu:
Jul 20 11:05:00 someapp kernel: CPU 0: hi: 0, btch: 1 usd: 0
Jul 20 11:05:00 someapp kernel: Node 0 DMA32 per-cpu:
Jul 20 11:05:00 someapp kernel: CPU 0: hi: 186, btch: 31 usd: 30
Jul 20 11:05:00 someapp kernel: active_anon:206043 inactive_anon:6347 isolated_anon:0
active_file:722 inactive_file:4126 isolated_file:0
unevictable:0 dirty:5 writeback:0 unstable:0
free:12202 slab_reclaimable:3849 slab_unreclaimable:14574
mapped:792 shmem:12802 pagetables:1651 bounce:0
free_cma:0
Jul 20 11:05:00 someapp kernel: Node 0 DMA free:4576kB min:708kB low:884kB high:1060kB active_anon:10012kB inactive_anon:488kB active_file:4kB inactive_file:4kB unevictable:0kB isolated(anon):0kB isolated(file):0kB present
Jul 20 11:05:00 someapp kernel: lowmem_reserve[]: 0 968 968 968
Jul 20 11:05:00 someapp kernel: Node 0 DMA32 free:44232kB min:44344kB low:55428kB high:66516kB active_anon:814160kB inactive_anon:24900kB active_file:2884kB inactive_file:16500kB unevictable:0kB isolated(anon):0kB isolated
Jul 20 11:05:00 someapp kernel: lowmem_reserve[]: 0 0 0 0
Jul 20 11:05:00 someapp kernel: Node 0 DMA: 17*4kB (UEM) 22*8kB (UEM) 15*16kB (UEM) 12*32kB (UEM) 8*64kB (E) 9*128kB (UEM) 2*256kB (UE) 3*512kB (UM) 0*1024kB 0*2048kB 0*4096kB = 4580kB
Jul 20 11:05:00 someapp kernel: Node 0 DMA32: 216*4kB (UE) 601*8kB (UE) 448*16kB (UE) 311*32kB (UEM) 135*64kB (UEM) 74*128kB (UEM) 5*256kB (EM) 0*512kB 0*1024kB 1*2048kB (R) 0*4096kB = 44232kB
Jul 20 11:05:00 someapp kernel: Node 0 hugepages_total=0 hugepages_free=0 hugepages_surp=0 hugepages_size=2048kB
Jul 20 11:05:00 someapp kernel: 17656 total pagecache pages
Jul 20 11:05:00 someapp kernel: 0 pages in swap cache
Jul 20 11:05:00 someapp kernel: Swap cache stats: add 0, delete 0, find 0/0
Jul 20 11:05:00 someapp kernel: Free swap = 0kB
Jul 20 11:05:00 someapp kernel: Total swap = 0kB
Jul 20 11:05:00 someapp kernel: 262141 pages RAM
Jul 20 11:05:00 someapp kernel: 7645 pages reserved
Jul 20 11:05:00 someapp kernel: 264073 pages shared
Jul 20 11:05:00 someapp kernel: 240240 pages non-shared
Jul 20 11:05:00 someapp kernel: [ pid ] uid tgid total_vm rss nr_ptes swapents oom_score_adj name
Jul 20 11:05:00 someapp kernel: [ 241] 0 241 13581 1610 26 0 0 systemd-journal
Jul 20 11:05:00 someapp kernel: [ 246] 0 246 10494 133 22 0 -1000 systemd-udevd
Jul 20 11:05:00 someapp kernel: [ 264] 0 264 29174 121 26 0 -1000 auditd
Jul 20 11:05:00 someapp kernel: [ 342] 0 342 94449 466 67 0 0 NetworkManager
Jul 20 11:05:00 someapp kernel: [ 346] 0 346 137495 3125 88 0 0 tuned
Jul 20 11:05:00 someapp kernel: [ 348] 0 348 79595 726 60 0 0 rsyslogd
Jul 20 11:05:00 someapp kernel: [ 353] 70 353 6986 72 19 0 0 avahi-daemon
Jul 20 11:05:00 someapp kernel: [ 362] 70 362 6986 58 18 0 0 avahi-daemon
Jul 20 11:05:00 someapp kernel: [ 378] 0 378 1621 25 8 0 0 iprinit
Jul 20 11:05:00 someapp kernel: [ 380] 0 380 1621 26 9 0 0 iprupdate
Jul 20 11:05:00 someapp kernel: [ 384] 81 384 6676 142 18 0 -900 dbus-daemon
Jul 20 11:05:00 someapp kernel: [ 385] 0 385 8671 83 21 0 0 systemd-logind
Jul 20 11:05:00 someapp kernel: [ 386] 0 386 31573 153 15 0 0 crond
Jul 20 11:05:00 someapp kernel: [ 391] 999 391 128531 2440 48 0 0 polkitd
Jul 20 11:05:00 someapp kernel: [ 400] 0 400 9781 23 8 0 0 iprdump
Jul 20 11:05:00 someapp kernel: [ 419] 0 419 27501 32 10 0 0 agetty
Jul 20 11:05:00 someapp kernel: [ 855] 0 855 22883 258 43 0 0 master
Jul 20 11:05:00 someapp kernel: [ 862] 89 862 22926 254 44 0 0 qmgr
Jul 20 11:05:00 someapp kernel: [23631] 0 23631 20698 211 43 0 -1000 sshd
Jul 20 11:05:00 someapp kernel: [12884] 0 12884 81885 3754 80 0 0 firewalld
Jul 20 11:05:00 someapp kernel: [18130] 0 18130 33359 291 65 0 0 sshd
Jul 20 11:05:00 someapp kernel: [18132] 1000 18132 33791 748 64 0 0 sshd
Jul 20 11:05:00 someapp kernel: [18133] 1000 18133 28867 122 13 0 0 bash
Jul 20 11:05:00 someapp kernel: [18428] 99 18428 208627 42909 151 0 0 node
Jul 20 11:05:00 someapp kernel: [18486] 89 18486 22909 250 46 0 0 pickup
Jul 20 11:05:00 someapp kernel: [18515] 1000 18515 352905 141851 470 0 0 npm
Jul 20 11:05:00 someapp kernel: [18520] 0 18520 33359 291 66 0 0 sshd
Jul 20 11:05:00 someapp kernel: [18522] 1000 18522 33359 294 64 0 0 sshd
Jul 20 11:05:00 someapp kernel: [18523] 1000 18523 28866 115 12 0 0 bash
Jul 20 11:05:00 someapp kernel: Out of memory: Kill process 18515 (npm) score 559 or sacrifice child
Jul 20 11:05:00 someapp kernel: Killed process 18515 (npm) total-vm:1411620kB, anon-rss:567404kB, file-rss:0kB
DwcとAdam Jaskiewiczが述べているように、犯人はおそらくOOM Killerでしょう。しかし、次の質問は次のとおりです。どうすればこれを防ぐことができますか。
いくつかの方法があります。
Systemtap(またはトレーサ)のようなツールは、カーネルのシグナル伝達ロジックを監視し、報告することができます。例: https://sourceware.org/systemtap/examples/process/sigmon.stp
# stap .../sigmon.stp -x 31994 SIGKILL
SPID SNAME RPID RNAME SIGNUM SIGNAME
5609 bash 31994 find 9 SIGKILL
そのスクリプトのフィルタリングif
ブロックは好みに合わせて調整することも、システム全体の信号トラフィックを追跡するために削除することもできます。バックトレースを収集することで、原因をさらに切り分けることができます(カーネルおよびユーザースペースに対して、それぞれプローブにprint_backtrace()
および/またはprint_ubacktrace()
を追加します)。
Lsf環境(対話式またはそれ以外)で、アプリケーションがキューの管理者またはキューに送信中のリソース要求によって事前設定されたしきい値を超えてメモリ使用率を超えた場合、プロセスは強制終了されます。逃げる。設定方法によっては、送信時にEメールが送信されるとは限りません。
この場合の1つの解決策は、より大きなリソースを持つキューを見つけるか、送信でより大きなリソース要件を定義することです。
また、man ulimit
を確認することをお勧めします。
ulimit
をもたらしたKilled
を覚えていませんが、それが必要になってからしばらく経ちました。
私たちは、顧客サイト(Red Hat、私は思う)でLinuxの下で繰り返し起こる問題を抱えていました。OOMKiller(out-of-memory killer)が私たちの基本的なアプリケーション(つまりサーバーが存在する理由)とデータベースプロセスの両方を殺しました。
いずれの場合も、OOMKillerは単にプロセスが多くのリソースを使用していると判断しました。リソース不足のためにマシンが故障することすらありませんでした。アプリケーションもそのデータベースも、メモリリーク(またはその他のリソースリーク)の問題はありません。
私はLinuxの専門家ではありませんが、いつ何かを殺すべきかを決定するためのアルゴリズムと、何を殺すべきかが複雑であることをまとめました。また、私はOOMKillerがカーネルに焼き付けられていて、単純に実行することはできないと言われました(私はこれの正確さについて話すことができません)。
私の場合、これはLaravelキューワーカーで起こっていました。システムログには殺害については何も言及されていなかったので、私はさらに調べたところ、メモリ制限(デフォルトでは128Mに設定されている)を超えたジョブのためにワーカーは基本的に自分自身を殺害していた。
--timeout=600
と--memory=1024
を使ってキューワーカーを実行すると、問題が解決しました。
スワップサイズを増やす :でこの問題を解決しました。
https://askubuntu.com/questions/1075505/how-do-i-increase-swapfile-in-ubuntu-18-04
私は最近この問題に遭遇しました。最後に、Opensuseのzypper updateが自動的に呼び出された直後に、プロセスが強制終了されたことがわかりました。 zypper updateを無効にすることで私の問題は解決しました。
ユーザーには、killまたはControl + Cを使用して自分のプログラムを強制終了することができますが、実際には起こらないという印象があり、ユーザーからはあなたに不満がありました。
rootはもちろんプログラムを殺すことができますが、誰かがあなたのマシンにrootを持ち、ものを殺しているのなら、もっと大きな問題があります。
あなたがシステム管理者ではない場合、システム管理者はCPU、RAM、ディスク使用量およびそれらを超えるプロセスの自動強制終了にクォータを設定しているかもしれません。
それらの推測以外に、私はプログラムに関するより多くの情報なしではわからない。