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

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

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

  • ソースコードがないため、OS側ですべてのテストを実行する必要があります。
  • 次のようなことができたらいいなlimitmemory 400k -p <pid>

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

答え1

ulimit -v、これはシェル組み込みですが、必要な操作を実行する必要があります。

私は時々初期化スクリプトでこれを使用します:

ulimit -v 128k
command
ulimit -v unlimited

しかし、プログラムの実行中に最大割り当て可能メモリを操作する方法が欲しいと思います。おそらく優先順位を操作するのと同じでしょうrenice

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

答え2

カーネルが 2.6.36 以上、util-linux が 2.21 以上の Linux システムでは、次のものを使用できます。限界プロセスリソース制限を設定するコマンド:

prlimit --as=400000 --pid <pid>

これは、プロセスが使用できる最大仮想メモリ量を400000に制限します。で、特定のプロセスに対して制限される可能性があるリソースの完全なリストを見つけることができますman 2 prlimit

コメントとマニュアルページに記載されているように、RSSの数を制限することはカーネル> 2.4.0および< 2.4.30では効果がありません。

答え3

Linuxシステムでは、次の場所でメモリコントローラを使用できます。対照群 バージョン1またはバージョン2

システム簡単に考えるリソース使用量の制御、特にcgroups-v2を持つシステムでは:

MemoryHigh=bytes

  このデバイスで実行されるプロセスのメモリ使用量制限を指定します。やむを得ずメモリ使用量が限度を超えることもあり、この場合、プロセス速度がひどく遅くなり、メモリを多く占めることになる。これは単位メモリ使用量を制御する基本的なメカニズムです。 [… ]

MemoryMax=bytes

  このデバイスで実行されるプロセスのメモリ使用量の絶対制限を指定します。メモリ使用量を制限以下に制御できない場合、デバイス内部でOut of Memory Killerが呼び出されます。MemoryHigh=基本的な制御メカニズムとMemoryMax=最後の防御線として使用することをお勧めします。 [… ]

MemoryLimit=bytes

  実行中のプロセスの最大メモリ使用量制限を指定します。 [… ]

  この設定は廃止されました。代わりに使用してくださいMemoryMax=

完全なサービスを作成してカスタマイズしたくないだけで一時コマンドを実行したい場合は、次のものを使用できます。システム実行中ユーザー提案ユーティリティこんにちは天使:

systemd-run --scope -p MemoryMax=1G firefox

--scope

.scopeデフォルトの一時要素の代わりに一時要素を作成します.service(上記を参照)。

--property=-p

  作成した範囲またはサービス単位の属性を設定します。このオプションはsystemctl(1)と同じ形式で割り当てを受け取ります。プロパティ設定注文する。

答え4

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=50M50MiBに制限します。

結果は次のとおりです。

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

関連情報