ほとんどの場合、コンピューターがスワップを必要とするようになると、CPU使用率が大幅に上昇します(kswapd0
は常に99%〜100%のCPUを使用しています)。 top
によると、時間はsy
(IO待機)ではなくwa
(システム/カーネル)で費やされています。
Linux 4.0.4-2-ArchをC720上で2GBのRAMと6GBのスワップをSSDで実行しています。
廃棄ページ(TRIM)がオンになっているかどうかにかかわらず、この問題があるようです。
これを修正できるかどうかを確認または調整する必要のある設定はありますか?
問題をデバッグする方法はありますか?カーネルスレッドの場合、strace
のようなものですか?
デフォルトのArch Linux設定で実行:
/proc/sys/vm/swappiness
= 60
/proc/sys/vm/vfs_cache_pressure
= 100
/sys/kernel/mm/transparent_hugepage/enabled
= [always] madvise never
Ubuntu 14.04.1 LTSでLinuxカーネル4.4.0を実行しているC720に2 GB RAMおよび2 GBのスワップを搭載しています。
Chrome/Chromiumの使用量が多い場合を想定して、システムのパフォーマンスを向上させる方法をいくつか紹介します。
/etc/default/grub
を編集し、次のカーネルパラメータをGRUB_CMDLINE_LINUX_DEFAULT
行に追加します。elevator=noop
zswap.enabled=1
transparent_hugepage=madvise
Sudo update-grub2
を実行します。/etc/sysctl.conf
を編集して、以下を追加します:vm.swappiness=25
#〜max(RES in top
)* 2/RAM = 500 MB/2 GBvm.vfs_cache_pressure=1000
#定期的にキャッシュを削除するよりも安全次のように変更を確認できます。
$ dmesg | grep -i noop
[ 0.694680] io scheduler noop registered (default)
$ dmesg | grep -i zswap
[ 0.724855] zswap: loaded using pool lzo/zbud
$ cat /sys/kernel/mm/transparent_hugepage/enabled
always [madvise] never
$ sysctl vm.swappiness
vm.swappiness = 25
$ sysctl vm.vfs_cache_pressure
vm.vfs_cache_pressure = 1000
更新
手順3でvm.min_free_kbytes
を増やすと効果的です。 131072
(128 MB)の値を試してください。最後の要点は、デスクトップ上のLinuxがメモリ不足の状況では十分に機能しないことです。 Chrome/Chromiumをcgroup
に配置することを提案している人もいますが、それはこの回答の範囲を超えています。
kswapカーネルは、メモリページの割り当てと解放に使用されます。スワップが使用されている場合、このカーネルスレッドがCPU時間を多く使用していることがわかります。つまり、kswapカーネルスレッドがメモリページをスキャンして、一部のページをスワップし、メモリ割り当て要求を処理します。 。
この場合は、OSのメモリが自動的に不足しているときにカーネルがキャッシュを再利用するため、キャッシュを削除しても役に立たないと思います。
メモリに問題がなく、free
コマンドを使用すると、キャッシュとして使用されるメモリが多くなりますが、メモリに問題がある場合、Linuxはメモリ割り当てリクエストを処理するためにキャッシュを減らします。キャッシュを削除する必要がある
sar -B
およびmajft
とpgscank
の値を探し、他の値はman sar
(これは準回答です-コメントするには長すぎますが、すぐに回答することはできません)
1)6Gではなく1Gb以下の使用についてはどうですか(mkswap
でサイズを設定できますが、スワップパーティションのサイズ変更はありません)—試しましたか?どんな結果?
2)sysctl vm.swappiness
、sysctl vm.vfs_cache_pressure
とは何ですか?
3)cat /sys/kernel/mm/transparent_hugepage/enabled
とは何ですか?
N. B.そのような設定では、SSDが大幅に消耗することに気づいていますか(RAMはそれほど多くなく、大規模なスワップ)。
P. S. UltraKSMを使用することをお勧めしますが、カーネルにパッチを適用する必要があります。私は自分のビルドをいくつか持っています( -realtime および [〜#〜] bfs [〜#〜] ベース)が、それらは.deb
用ですベースのシステムである一方で、それらはさまざまなシステムで非常に簡単に使用できます(通常、.deb
sを解凍して対応するinitrd/initramfsを作成するだけでよく、Linuxのその側面に慣れていない人にとっては面倒かもしれません) )
(つづく)
Puppeteer(chrome headless api)などのdockerの内部でサービスを実行している場合、dockerfile内に dumb-init を追加します。
Docker> = 1.13.0を実行している場合は、docker runの--init argを使用してゾンビプロセスを取得します
docker run container --init
Dockerで<= 3.0を実行している場合は、dumb-initを使用します。これをDockerfileに追加します。
ADD https://github.com/Yelp/dumb-init/releases/download/v1.2.0/dumb-init_1.2.0_AMD64
/usr/local/bin/dumb-init
RUN chmod +x /usr/local/bin/dumb-init
ENTRYPOINT ["dumb-init", "--"]