
ヘッドレスサーバーでランダムなセグフォルトを診断しようとしているのに奇妙に思われる1つの事実は、メモリ不足の状況でのみ発生するように見え、スワップサイズが0を超えないことです。
コンピュータが正常に動作していることを確認するために強制的に交換するにはどうすればよいですか?
orca ~ # free
total used free shared buffers cached
Mem: 1551140 1472392 78748 0 333920 1046368
-/+ buffers/cache: 92104 1459036
Swap: 1060280 0 1060280
orca ~ # swapon -s
Filename Type Size Used Priority
/dev/sdb2 partition 1060280 0 -1
答え1
これはLinuxですか?その場合は、次のことを試すことができます。
# sysctl vm.swappiness=100
(デフォルトを確認するために最初にこれを使用したいかもしれません。sysctl vm.swappiness
私のシステムでは10
)
次に、多くのRAMを使用するプログラムを使用するか、RAMのみを使用する小さなアプリケーションを作成します。以下はこれを行います(ソース:Linuxディスクキャッシュによる実験と楽しさ):
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
int main(int argc, char** argv) {
int max = -1;
int mb = 0;
int multiplier = 1; // allocate 1 MB every time unit. Increase this to e.g.100 to allocate 100 MB every time unit.
char* buffer;
if(argc > 1)
max = atoi(argv[1]);
while((buffer=malloc(multiplier * 1024*1024)) != NULL && mb != max) {
memset(buffer, 1, multiplier * 1024*1024);
mb++;
printf("Allocated %d MB\n", multiplier * mb);
sleep(1); // time unit: 1 second
}
return 0;
}
Linux仮想メモリマネージャは実際にRAMを割り当てないほどスマートであるため、ブロックをゼロではなく1に初期化するようにmemset行をコーディングします。メモリを消費してスワップする過程を見守る時間をさらに与えるために sleep(1) を追加しました。プログラムに提供する十分なRAMとSWAPがない場合、OOMキラーはプログラムを終了します。次のコマンドでコンパイルできます。
gcc filename.c -o memeater
ここで、filename.cは上記のプログラムを保存したファイルです。その後、./memeaterを使用して実行できます。
私は生産機械ではこれをしません。
答え2
このドキュメントのテストを実行するには、次のものが必要です。
最初のテストでは、通常の状況でスワップパーティションを正常に読み書きできることを確認する必要があります。次のコマンドを実行してこれを実行できます。amount_of_swap
実際に保有している両替金額に変更することを忘れないでください。timeout
交換が特に遅いか大きい場合でも、増加する必要があるかもしれません。
$ amount_of_swap=2G
$ timeout=60
$ systemd-run --property="MemoryHigh=128M" -- \
stress-ng \
--timeout "$timeout" \
--vm 1 \
--vm-hang 0 \
--vm-method zero-one \
--vm-bytes "$amount_of_swap"
Running as unit: run-u7.service
$ # Wait for it to start using swap, then run:
$ free
total used free shared buff/cache available
Mem: 479432 345384 19136 3284 114912 117948
Swap: 2097148 1975096 122052
$ # Make sure that stress-ng exited successfully:
$ unit_name=run-u7.service # This might be different on your system. See systemd-run’s output.
$ journalctl --boot --unit="$unit_name"
Started /nix/store/fmsawx6292lg2mc96hj5gmql1mk973dz-stress-ng-0.17.01/bin/stress-ng --timeout 60 --vm 1 --vm-hang 0 --vm-method zero-one --vm-bytes 2G.
invoked with '/nix/store/fmsawx6292lg2mc96hj5gmql1mk973dz-stress-ng-0.17.01/bin/stress-ng --timeout 60 --vm 1 --vm-hang 0 --vm-method zero-one --vm-bytes 2G' by user 0 'root'
stress-ng: info: [2237] setting to a 1 min, 0 secs run per stressor
stress-ng: info: [2237] dispatching hogs: 1 vm
system: 'jasonyundt' Linux 6.8.1 #1-NixOS SMP PREEMPT_DYNAMIC Fri Mar 15 18:19:29 UTC 2024 x86_64
memory (MB): total 468.20, free 127.03, shared 3.21, buffer 1.59, swap 2048.00, free swap 2046.73
stress-ng: info: [2237] skipped: 0
stress-ng: info: [2237] passed: 1: vm (1)
stress-ng: info: [2237] failed: 0
stress-ng: info: [2237] metrics untrustworthy: 0
stress-ng: info: [2237] successful run completed in 1 min, 3.96 secs
run-u7.service: Deactivated successfully.
run-u7.service: Consumed 28.368s CPU time, no IP traffic.
このfree
コマンドの出力には、スワップが実際に使用されたかどうかが表示されます。
ほとんどの場合、以前のテストで十分です。残念ながら、カーネルにメモリが不足すると、カーネルが利用できないスワップ領域が作成される可能性があります。具体的に以下の場合min_free_kbytes
使用可能なメモリが残っている場合、カーネルは最小メモリ緊急モードに入ります。PF_MEMALLOC
割り当てが許可されます。スワップデバイスまたはスワップファイルへの書き込みに非PF_MEMALLOC
メモリ割り当てが必要な場合、RAMを使いすぎるとシステムがクラッシュします。
以下を使用して制限に達すると、min_free_kbytes
システムがハングするかどうかをテストできます。
#!/usr/bin/env bash
# Again, remember to potentially adjust amount_of_ram and timeout.
amount_of_ram=1G
timeout=60
original_min_free_kbytes="$(sysctl -n vm.min_free_kbytes)"
sudo -v
{
sleep "$(( timeout / 2 ))"
free
sudo sysctl vm.min_free_kbytes="$(( 128 * 1024 ))"
} &
stress-ng \
--timeout "$timeout" \
--vm 1 \
--vm-hang 0 \
--vm-method zero-one \
--vm-bytes "$amount_of_ram" &
wait
sudo sysctl vm.min_free_kbytes="$original_min_free_kbytes"
システムが正常な場合、スクリプトは正常に終了します。システムPF_MEMALLOC
が交換するために非メモリ割り当てを必要とする場合これ起こる:
[ 1106.923468] INFO: task systemd:1 blocked for more than 122 seconds.
[ 1106.924018] Tainted: G W 6.8.1 #1-NixOS
[ 1106.924512] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this
message.
[ 1106.925344] INFO: task kthreadd:2 blocked for more than 122 seconds.
[ 1106.925876] Tainted: G W 6.8.1 #1-NixOS
[ 1106.926356] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this
message.
[ 1106.927188] INFO: task kworker/u2:0:11 blocked for more than 122 seconds.
[ 1106.927757] Tainted: G W 6.8.1 #1-NixOS
[ 1106.928234] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this
message.
[ 1106.929447] INFO: task kworker/u2:1:23 blocked for more than 122 seconds.
[ 1106.930018] Tainted: G W 6.8.1 #1-NixOS
[ 1106.930506] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this
message.
[ 1106.931598] INFO: task kswapd0:37 blocked for more than 122 seconds.
[ 1106.932129] Tainted: G W 6.8.1 #1-NixOS
[ 1106.932619] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this
message.
[ 1106.933396] INFO: task kworker/0:3:139 blocked for more than 122 seconds.
[ 1106.933968] Tainted: G W 6.8.1 #1-NixOS
[ 1106.934452] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this
message.
[ 1106.935430] INFO: task systemd-udevd:425 blocked for more than 122 seconds.
[ 1106.936051] Tainted: G W 6.8.1 #1-NixOS
[ 1106.936611] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this
message.
[ 1106.937482] INFO: task systemd-oomd:578 blocked for more than 122 seconds.
[ 1106.938077] Tainted: G W 6.8.1 #1-NixOS
[ 1106.938582] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this
message.
[ 1106.939438] INFO: task systemd-timesyn:605 blocked for more than 122 seconds.
[ 1106.940063] Tainted: G W 6.8.1 #1-NixOS
[ 1106.940572] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this
message.
[ 1106.941436] INFO: task kworker/0:5:642 blocked for more than 122 seconds.
[ 1106.942028] Tainted: G W 6.8.1 #1-NixOS
[ 1106.942539] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this
message.