2022年12月31日(土) [長年日記]
■ [dev][howto] メモリに負荷をかけるワンライナー
$ a=$(head --bytes 100M /dev/zero | cat -v)
これでシェル変数aに200MB分の文字列が設定され、同程度のメモリが消費される。cat -vが 0 を ^@ の2文字に変換するのでheadで指定した2倍の量になる。
が、bashだと想定通りに動くがzshだとメモリ使用量が多くなってしまう。
$ bash $ free -b total used free shared buff/cache available Mem: 40298315776 954339328 39173054464 65536 170921984 38951944192 Swap: 10737418240 0 10737418240 $ a=$(head --bytes 100M /dev/zero | cat -v) $ free -b total used free shared buff/cache available Mem: 40298315776 1165631488 38961754112 65536 170930176 38740647936 Swap: 10737418240 0 10737418240 $ unset a $ free -b total used free shared buff/cache available Mem: 40298315776 955932672 39171452928 65536 170930176 38950346752 Swap: 10737418240 0 10737418240
$ zsh % free -b total used free shared buff/cache available Mem: 40298315776 967888896 39159525376 65536 170901504 38938406912 Swap: 10737418240 0 10737418240 % a=$(head --bytes 100M /dev/zero | cat -v) % free -b total used free shared buff/cache available Mem: 40298315776 1388785664 38738612224 65536 170917888 38517501952 Swap: 10737418240 0 10737418240 % unset a % free -b total used free shared buff/cache available Mem: 40298315776 1177305088 38950068224 65536 170942464 38728966144 Swap: 10737418240 0 10737418240 % a=$(head --bytes 100M /dev/zero | cat -v) % free -b total used free shared buff/cache available Mem: 40298315776 1386938368 38740426752 65536 170950656 38519332864 Swap: 10737418240 0 10737418240
zshだと、最初に400MB増えて、変数aを削除すると200MBだけ解放され、もう一度実行すると今度は200MB増える。
なお、手元の環境だとheadで指定するサイズを1Gにするとコマンドが返らなくなる。これはWSL上で実行しているために何かの制限に引っかかっているのかなと思っている(シェルのプロセスサイズが2GBになった所で止まっているように見える)が、原因はわからない。