echo 4G > memory.max: memory.max は常に 0 です。

echo 4G > memory.max: memory.max は常に 0 です。

以下を使用してcgroup2のメモリ制限を設定しようとしています。

echo 4G > memory.max

これは私のラップトップではうまく機能しますが、私のサーバーでは何を書くか(書き込みが機能していなくても)常に返しますcat memory.max0max0

ここで何が起こっているのか、どうすれば解決できますか?

答え1

問題はechoを使用するときに末尾の改行文字が原因で発生します0

たとえば、

$ cat memory.max 
max
$ echo 4G > memory.max 
$ cat memory.max 
0
$ echo -n 4G > memory.max 
$ cat memory.max 
4294967296
$ echo max > memory.max 
$ cat memory.max 
0
$ echo -n max > memory.max 
$ cat memory.max 
max

通常、改行文字と一緒に使用する必要がありますが、どの文字に依存します。図書館使用しているバージョンです。

たとえば、glibcを持つシステムでは、strace echo 4G次のものが返されます。

...
write(1, "4G\n", 34G
)                     = 3
...

ただし、musl-libcを使用すると、次の結果が表示されます。

...
writev(1, [{iov_base="4G", iov_len=2}, {iov_base="\n", iov_len=1}], 24G
) = 3
...

関連情報