メモリ管理のプロセスをテストする必要があります。
limitmemory 400k -p <pid>
UNIXでこれを行う方法はありますか?一般的なUNIXユーティリティは優れています。
ulimit -v
、それはシェル組み込みですが、それはあなたが望むことをするはずです。
私は時々それをinitスクリプトで使用します:
ulimit -v 128k
command
ulimit -v unlimited
ただし、プログラムの実行中に割り当て可能な最大メモリを操作する方法が必要なようですが、それは正しいですか。おそらく、優先度を操作するためのrenice
のようなものです。
しかし、私の知る限り、そのようなツールはありません。
プログラムの起動時に制限を設定するには、 polemon で示されているようにulimit -v 400
を使用します。これにより、シェルとそのすべての子孫の制限が設定されるため、スクリプトで(ulimit -v 400; myprogram)
のようなものを使用してスコープを制限することができます。
実行中のプロセスの制限を変更する必要がある場合、そのためのユーティリティはありません。 setrlimit
システムコールを実行するには、プロセスを取得する必要があります。多くの場合、これはデバッガで実行できますが、常に確実に機能するとは限りません。これはgdbでこれを行う方法です(テストされていません。9はLinuxのRLIMIT_AS
の値です)。
gdb -n -pid $pid -batch -x /dev/stdin <<EOF
call setrlimit(9, {409600, -1})
detach
quit
EOF
カーネル> = 2.6.36およびutil-linux> = 2.21のLinuxシステムでは、 prlimit コマンドを使用してプロセスのリソース制限を設定できます。
prlimit --rss=400000 --pid <pid>
Systemdを使用している場合は、.service
ファイルでいくつかの追加オプションを設定できます。設定できるオプションの完全なリスト ここで説明 。
以下は、systemdのこの機能の使用方法を示す短い例です。
# cat /etc/systemd/system/qbittorrent-nox.service
[Unit]
Description=qbittorrent-nox
Documentation=man:qbittorrent-nox
DefaultDependencies=yes
Requires=media-Kabi.mount
After=media-Kabi.mount network-online.target
Before=multi-user.target
Conflicts=umount.target
[Service]
User=morfik
Group=p2p
Type= simple
RemainAfterExit=no
ExecStart=/usr/bin/qbittorrent-nox
Nice=19
IOSchedulingClass=idle
PrivateNetwork=no
CPUShares=256
MemoryLimit=50M
BlockIOWeight=128
Slice=p2p.slice
StandardError=null
StandardOutput=null
[Install]
WantedBy=multi-user.target
もちろん、私が使用したすべてのオプションが必要なわけではありません。メモリ使用量を制限するだけの場合は、MemoryLimit=50M
を追加します。これは50MiBに制限されます。
そしてこれが結果です:
# systemctl status qbittorrent-nox.service
● qbittorrent-nox.service - qbittorrent-nox
Loaded: loaded (/etc/systemd/system/qbittorrent-nox.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2015-05-07 19:25:20 CEST; 1s ago
Docs: man:qbittorrent-nox
Main PID: 21712 (qbittorrent-nox)
Memory: 9.4M (limit: 50.0M)
CGroup: /p2p.slice/qbittorrent-nox.service
└─21712 /usr/bin/qbittorrent-nox
May 07 19:25:20 morfikownia systemd[1]: Started qbittorrent-nox.
May 07 19:25:20 morfikownia systemd[1]: Starting qbittorrent-nox...
これまでのところ、これはシステムデーモン/サービスに対してのみ機能し、たとえば、Firefoxプロセスをこのように通常のユーザーとして制限することはできません。しかし、多分 これはいつか変わるでしょう 。
Cでプロセスの制限を設定できる setrlimit()関数 があります。setrlimitを呼び出して制限したいコマンドを実行するCプログラムを記述します。 setrlimitは他のプロセスの制限を変更できません。
幸いなことに、誰かがすでに似たようなものを書いています。 freshmeat からダウンロードできます。私はソースコードをざっと見ましたが、それは問題ないようです。独自の裁量でrlimitを使用してください。 rlimitは他のプロセスの制限も変更できないことに注意してください。
編集:Gillesはgdbを使った素敵なハックを提案しました:gdbを使ってプロセスに接続し、プロセスにsetrlimitを呼び出します。これはおそらく、すでに実行中のプロセスを制限する問題を解決するでしょう。
プログラムのメモリ使用量をテストして測定するだけの場合は、 time を参照してください。 CPU時間やメモリの使用状況など、さまざまな側面でプログラムのリソース使用状況を測定できます。次のコマンドは、myProgram
のメモリ使用量とCPU時間使用量を示します。
/usr/bin/time myProgram
(bash組み込みのtimeコマンドと区別するために、絶対パスを必ず指定してください。)
プロセスのリソースを制限するだけの場合は、この特定のタスクのテストユーザーを作成することをお勧めします。必要に応じてこのユーザーのリソースを制限し、ユーザーがプロセスを実行します。 * nixの世界では、ユーザーに基づくリソース管理は、プロセスに基づくリソース管理よりもはるかに進んでいるようです。
確認してもいい /etc/security/limits.conf
ユーザーのリソースを制限します。または、制限される予定のユーザーでログインした後、ulimit
を使用できます。