メモの日々


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になった所で止まっているように見える)が、原因はわからない。