実行中のプロセスにulimitを設定する


25

サーバーアプリケーションを起動し、テスト目的で長時間実行したい。残念ながら、ulimit -c unlimited最終的なクラッシュをキャッチして検査する前に設定するのを忘れていました。私にできることはありますか?

回答:


39

Linuxの最近のバージョン(2.6.36以降)では、prlimitコマンドとシステムコールを使用して、任意のプロセスのリソース制限を設定できます(適切な権限が与えられている場合)。

$ prlimit --core=unlimited: --pid $$
$ prlimit --core --pid $$
RESOURCE DESCRIPTION             SOFT      HARD UNITS
CORE     max core file size unlimited unlimited blocks

prlimitコマンドにはutil-linux-2.21が必要ですが、それ以外の場合は、prlimitシステムコールを呼び出すクイックプログラムを一緒にスローできる必要があります。

int prlimit(pid_t pid, int resource, const struct rlimit *new_limit, struct rlimit *old_limit);

Linux(または別のOS)の新しい十分なバージョンがない場合、私が知っている唯一の修正は、デバッガーでプロセスに接続し、デバッガーからgdb発行することですsetrlimit

$ gdb -p $PID
...
(gdb) set $rlim = &{0ll, 0ll}
(gdb) print getrlimit(9, $rlim)
$1 = 0
(gdb) print *$rlim
$2 = {-1, -1}
(gdb) set *$rlim[0] = 1024*1024
(gdb) print setrlimit(9, $rlim)
$3 = 0

これは設定のためにありulimit -mRLIMIT_AS = 9ulimit -c(x86-64上のLinuxのRLIMIT_CORE場合、数値にもまったく同じことが当てはまります4。「無制限」の場合RLIM_INFINITY、通常を使用します-1/usr/include/bits/types.hサイズを確認してくださいrlim_t。私は仮定していますlong long(実際には署名されていませんが、署名されたタイプを使用すると「無制限」-1が読みやすくなります)。


+1 gdbテクニックは本当にクールです。1つの注意点として、非ルートプロセスのオープンファイルの数をハード制限を超えて増やすことはできないようです。setrlimit呼び出しは-1を返し、errnoは22(無効な引数)です。
スティーブケレット14

2

Ubuntu 14.04 Trustyにはutil-linux-2.21(2.20)がないprlimitため、使用するCLIコマンドはありません。

使用Python3.4(Ubuntuの14.04以降のすべてのバージョンで利用可能である)+は実行中のプロセスのリソース制限を設定することができます。ルートとして実行:

1ライナー:

# PID=966
# grep 'open file' /proc/$PID/limits
Max open files            1024                 4096                 files     
# python3 -c "import resource; resource.prlimit($PID, resource.RLIMIT_NOFILE, (2048, 12345))"
# grep 'open file' /proc/$PID/limits
Max open files            2048                 12345                files   

またはより詳細:

# python3
Python 3.4.3 (default, Nov 28 2017, 16:41:13) 
[GCC 4.8.4] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import resource
>>> import os
>>> resource.prlimit(os.getpid(), resource.RLIMIT_NOFILE)
(1024, 4096)
>>> resource.prlimit(os.getpid(), resource.RLIMIT_NOFILE, (1369, 9999))
(1024, 4096)
>>> resource.prlimit(os.getpid(), resource.RLIMIT_NOFILE)
(1369, 9999)

動作確認:

# grep 'open file' /proc/1472/limits 
Max open files            1369                 9999                 files 

これは、glibc 2.13以降でLinux 2.6.36以降で動作することに注意してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.