web-dev-qa-db-ja.com

Unixで特定のプロセスが使用できるメモリの量を制限する方法はありますか?

メモリ管理のプロセスをテストする必要があります。

  • ソースがないので、すべてのテストをOS側から行う必要があります。
  • limitmemory 400k -p <pid>

UNIXでこれを行う方法はありますか?一般的なUNIXユーティリティは優れています。

38
Lazer

ulimit -v、それはシェル組み込みですが、それはあなたが望むことをするはずです。

私は時々それをinitスクリプトで使用します:

ulimit -v 128k
command
ulimit -v unlimited

ただし、プログラムの実行中に割り当て可能な最大メモリを操作する方法が必要なようですが、それは正しいですか。おそらく、優先度を操作するためのreniceのようなものです。

しかし、私の知る限り、そのようなツールはありません。

27
polemon

プログラムの起動時に制限を設定するには、 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

これについてはよくわかりませんが、 cgroups を使用して メモリ使用量 を制限することもできます。 cgroupsの利点は、すでに実行されているプロセスを制御できることです。ちなみに systemd はcgroupを使用してシステムサービスを制御します。

残念ながら、私は少し実験しましたが、私のFedora 13システムではうまく機能しないようです。

11

カーネル> = 2.6.36およびutil-linux> = 2.21のLinuxシステムでは、 prlimit コマンドを使用してプロセスのリソース制限を設定できます。

prlimit --rss=400000 --pid <pid>
9
Luca Gibelli

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プロセスをこのように通常のユーザーとして制限することはできません。しかし、多分 これはいつか変わるでしょう

3

Cでプロセスの制限を設定できる setrlimit()関数 があります。setrlimitを呼び出して制限したいコマンドを実行するCプログラムを記述します。 setrlimitは他のプロセスの制限を変更できません。

幸いなことに、誰かがすでに似たようなものを書いています。 freshmeat からダウンロードできます。私はソースコードをざっと見ましたが、それは問題ないようです。独自の裁量でrlimitを使用してください。 rlimitは他のプロセスの制限も変更できないことに注意してください。

編集:Gillesはgdbを使った素敵なハックを提案しました:gdbを使ってプロセスに接続し、プロセスにsetrlimitを呼び出します。これはおそらく、すでに実行中のプロセスを制限する問題を解決するでしょう。

1
nalply

プログラムのメモリ使用量をテストして測定するだけの場合は、 time を参照してください。 CPU時間やメモリの使用状況など、さまざまな側面でプログラムのリソース使用状況を測定できます。次のコマンドは、myProgramのメモリ使用量とCPU時間使用量を示します。

/usr/bin/time myProgram

(bash組み込みのtimeコマンドと区別するために、絶対パスを必ず指定してください。)

プロセスのリソースを制限するだけの場合は、この特定のタスクのテストユーザーを作成することをお勧めします。必要に応じてこのユーザーのリソースを制限し、ユーザーがプロセスを実行します。 * nixの世界では、ユーザーに基づくリソース管理は、プロセスに基づくリソース管理よりもはるかに進んでいるようです。

確認してもいい /etc/security/limits.confユーザーのリソースを制限します。または、制限される予定のユーザーでログインした後、ulimitを使用できます。

0
memin