特定のプロセスのCPU + RAMを節約するために、リソースの使用を制限する方法は?


25

sshdマシンのRAMが不足しているために動作しなくなることがある開発サーバーがあります。はい、メモリが不足しており、現在のところアップグレードは適切な選択ではありません。私がやりたいのは、マシンに「あなたがやりたいことは何でもやりましょう。ただし、20MBとCPUを省いてsshdください!」です。

どうすればできますか?


sshdはそのように爆発するべきではありません。通常は非常にうまく動作するデーモンです。最新/最高に更新されていることを確認してください。それで何をしているの?大量のデータをパイプで送っていますか?
マーチン

2
@Marcin私は何か大きなテキスト編集をしているとは思わない。場合でもsshd行儀され、私はそれではないだろう、使用するのに十分なCPU / RAMがない場合、それは立ち往生と思いますか?
プネヘヘ

Linuxがメモリを使い果たすと、プロセスを強制終了してメモリを再利用し始めます。OOMが動作している(メモリ不足のキラー)のが見えるかもしれません。どうして一貫してあなたのsshdを殺すことにしたのでしょうか。sshdが爆発する前に、実際にsshdがひどく漏れる(サイズが大きくなる)のを見たことがありますか?
マーチン

@Marcinの可能性は、彼がOOMである場合、システムが非常に動けなくなるので、sshdが応答できないだけです。これはsshdの問題ではなく、負荷の問題です。残念ながら、私はこれに対する答えを知りません。
-xenoterracide

@phunehehe問題はsshのメモリではなく、あなたの負荷が屋根を通っていないということですか?sshdはエラーを出しますか?箱の負荷はいくらですか?また、システムのメモリ不足の原因は何ですか。
xenoterracide

回答:


9

メモリリソースコントローラーでcgroupsを使用することで、おそらくそのようなことを実現できます。

リソースを消費するすべてのタスクを制限された(CPUとRAM)に配置しcgroupsshd制限されないように「外部」のままにしておくと思います。

(ただし、スワップファイルの形式であっても、スワップを追加することは良い選択肢かもしれません。)


私はまだためらっていますが、簡単に見えません(Ubuntuに甘やかされています)。
プネヘヘ

確かに簡単ではありません:-)スワップの追加ははるかに簡単です。
マット

@phuneheheシステム管理者であることを歓迎します。簡単ではありません。しかし、今は簡単なことをしない方法を学ぶ必要があります。
ゼノテラサイド

6

ああ、cgroupsは簡単です:) libcgroupパッケージをインストールします。/etc/cgconfig.confを作成します。

mount {
    cpu     = /cgroup/cpu_and_mem;
    cpuacct = /cgroup/cpu_and_mem;
    memory  = /cgroup/cpu_and_mem;
}

group sshd {
        cpu {
                cpu.shares="500";
        }
        cpuacct {
                cpuacct.usage="0";
        }
        memory {
                memory.limit_in_bytes="1G";
        }
}

group nosshd {
        cpu {
                cpu.shares="500";
        }
        cpuacct {
                cpuacct.usage="0";
        }
        memory {
                memory.limit_in_bytes="1G";
        }
}

cgconfig階層、cgroupを作成し、制限を設定するプロセスを開始します。それが成功した場合、CPUの50%が割り当てられ、1Gのメモリが使用可能な2つのcgroupがあります(使用可能なメモリの実際の量はわかりません。この例では2Gであると仮定します)。ここで、すべてのタスク(つまり、システムで実行されているすべてのプロセス)をルートグループからnosshd cgroupに移動するだけです。

cgroup]# cat tasks >> nosshd/tasks
cgroup]# echo > tasks

次に、sshdプロセスのPIDを取得し、それをsshdタスクファイルに移動するだけです。

cgroup]# echo $PID >> sshd/tasks

タダ、完了です。これで、sshdには常にCPUの50%と1Gのメモリがあるので安心できます。


1

reniceより高い優先度を取得するsshdか、アカウンティングを確認するために使用します。(acct)->これでユーザーのリソースを設定できるので、sshdをsで実行します


私もそれに加えioniceて、おそらくsshdを起動して、後でそれを無視しないでください。
-xenoterracide

1

アプリケーションのリソース使用量の問題に対するより一般的な解決策は、Dockerを使用してコンテナでアプリケーションを実行することです。その後、cgroupsと同様のCPUおよびメモリ使用制限でコンテナを実行できます。

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