私が直面している問題の1つは、大量のデータを含むサーバーセットがあることです。各ホストは、処理する必要があるデータを取得するために、異なるホストへの複数のscp接続を並列に確立する特定のプロセスp1の複数のインスタンスを実行します。これにより、そのホストに多くの負荷が発生し、複数回ダウンします。
単一のホストで実行できる同時scpプロセスの数を制限する方法を探しています。
ほとんどのリンクは、/etc/ssh/sshd_configのMaxStartupおよびMaxSessions設定を指し、これは特定のポイントで作成/開始できるSSHセッションの数を制限することに関連しています。
ここで使用できる特定のscp設定ファイルはありますか?それとも、同時に実行できる特定のプロセス/コマンドのインスタンス数を制限するシステムレベルの方法はありますか?
答え1
scp
そのような機能自体はありません。 GNUと共にparallel
sem
次のコマンドを使用できます(シグナル)同時プロセスを任意に制限します。
sem --id scp -j 50 scp ...
--id
これは同じです。 51番目のプロセスを開始しようとすると、他のプロセスの1つが終了するまで無期限に待機します。プロセスをフォアグラウンドに保持するには、追加します--fg
(デフォルトはバックグラウンドで実行するものですが、これはシェルバックグラウンドプロセスと同じようには機能しません)。
ステータスはに保存されているため、${HOME}/.parallel/
複数のユーザーがそれを使用している場合は、必要に応じて機能せず、scp
ユーザーごとに下限を設定する必要があります。 (呼び出し時にHOME
環境変数をオーバーライドしsem
、グループが書き込みを許可していることを確認し、ステータスを共有するように権限を変更することも可能でなければなりません。umask
しかし、まだYMMVをあまりテストしていません。)
parallel
perl
いくつかの標準モジュールだけが必要です。
NがkBps単位の伝送制限であるところを使用することscp -l N
、特定のパスワードを選択する(必要なセキュリティレベルに応じて速度のために)、圧縮を無効にする(特にデータがすでに圧縮されている場合)、CPUへの影響をさらに減らすこと考慮することもできます。
の場合、scp
sshは実際にはパイプであり、scp
各端で1つのインスタンスが実行されます(受信端は文書化されていない-t
オプションで実行されます)。に関してはMaxSessions
これは役に立ちません。 「セッション」は単一のSSH接続を介して多重化されます。逆に、誤った情報が豊富であるにもかかわらず、MaxSessions
限界ただ他の制限なしにTCP接続ごとのセッションを再利用します。
PAMモジュールpam_limits
同時ログイン制限がサポートされているため、OpenSSHがPAMとして構築され、usePAM yes
存在する場合は、sshd_config
ユーザー名、グループメンバーシップなどに基づいて制限を設定できます。その後、maxlogins
ログインに厳密な制限を設定できます/etc/security/limits.conf
。しかし、ssh
これは、justとjustを使用した新しいログインだけでなく、各ユーザーのすべてのログインを計算するため、scp
専用のユーザーIDがないと問題が発生する可能性がありますscp
。有効にすると、対話型SSHセッションでも機能します。この問題を解決する1つの方法は、sshd
バイナリをコピーまたはシンボリックリンクしてから呼び出すことです。sshd-scp
その後、別々のPAM設定ファイルを使用できます。つまり/etc/pam.d/sshd-scp
、pam_start()
OpenSSH 呼び出しの「サービス名」はバイナリ名に設定されます。 )から電話を受けました。別のポート(またはIP)で実行する必要があり、別のポートを使用するのもsshd_config
良い方法です。これを実装するとscp
制限に達すると失敗します(終了コード254)、転送中にこれを処理する必要があります。
(他のオプションには以下が含まれます。ionice
そしてcpulimit
、これはscp
セッションがタイムアウトしたり、長い間中断され、より多くの問題を引き起こす可能性があります。 )
同様の操作を実行する古い方法はatd
and を使用するbatch
ことですが、これは並行性調整を提供せず、ロードが特定のしきい値を下回ると、プロセスをキューに追加して開始します。新しい亜種はジョブスプーラより構成可能な順次/並列方式でジョブのキューと実行をサポートし、ランタイムの再構成(キューのジョブや並行性設定の変更など)をサポートします。ただし、ロードまたはCPU関連の制御自体を提供するわけではありません。