`nice`はLinuxにとってあまり役に立ちません。

`nice`はLinuxにとってあまり役に立ちません。

私はリモートDebianインストールの一般ユーザー(管理者ではありません)です。私はそこで非常に多様な専用のWebサーバーを運営しています。毎日サーバーによって生成されるログは、サイズが非常に大きいため、毎月タールボールでパッケージ化され、一定時間後に圧縮する必要があります。まず私はこれを試しました:

tar rf 2014-12.tar 2014-12-*.log

10分後、ある顧客が電話をかけてサーバーが応答を停止したと言いました。実際、サーバープロセスは「保留」状態であり、すべての関心はtarプロセスに集中しています。によると、合計CPU負荷はtopわずか5%です。次に、次のことを試してください。

nice -n19 tar rf 2014-12.tar 2014-12-*.log &

サーバープロセスを監視できるようにバックグラウンドでコマンドを送信します。サーバープロセスが遅くなることを観察しましたが、それほど遅くはなかったため、許可できます。約5分間、すべてがうまくいったので、突然サーバーが再び動作を停止しました。 tarプロセスを終了し、サーバーがすぐに動作を開始するのを見ました。

サーバーは、多くのクライアントが接続するTCPソケットを受信して​​います。 tarが実行されている間、サーバーは機能し続けますが、しばらくすると、select呼び出しが読み取り可能なソケットの更新を停止するようです。

すべてが混乱しています。他のジョブが実行されていますが、数分後にサーバーがハングアップしているようですが、それ以外は数ヶ月間問題なく実行されます。によると、top私のプロセスはCPU全体の約5%以上を占めていないようです。なぜですか?サーバープロセスを中断することなくログをどのように圧縮できますか?

答え1

muruが述べたように、niceCPUスケジューリングのみを制御します。当時、CPU使用率は5%程度に過ぎなかったと直接指摘しました。これは、システムが真剣にIOバインドされていることを意味し、これはディスクの読み取り/書き込みがボトルネックを引き起こすことを意味します。

コマンドを使用すると、プロセスに付与されるIOの優先順位を制御できますionice。 3 つの予約クラスのいずれかにプロセスを配置できます。

  • アイドル - 他のプログラムがディスクを必要としない場合にのみディスク時間を取得します。
  • ベストエフォート - デフォルトではデフォルト
  • リアルタイム - このクラスは、何が起こっても最初にディスクにアクセスします。

オプションを使用してクラスを指定できます-c。 1 =リアルタイム、2 =ベスト、3 =アイドル。

また、最善の努力とリアルタイムの状況の両方で、同じレベルのプロセス間微調整のための8つの優先順位レベルがあります。

私は通常「アイドル」の最も低いレベルであるtarorrsyncのようなコマンドを実行します。ionice -c3これにより、他のプロセスへのディスクアクセスが不足しなくなります。

IMHOはioniceCFQ I / Oスケジューラ(カーネルパラメータ)で最もよく機能します。

答え2

観察された動作はファイルシステムの実装の詳細かもしれません。つまり、メモリに大量のデータを収集して一括書き込みすることができます。この問題を解決する最も簡単な方法は、記録するデータの量を減らすことです =)。この問題を回避するには、すぐにファイルをインポートすることをお勧めします。ディスク速度が遅い場合、アーカイブされていないtarを保存する意味はありません。アーカイブを作成するには、tarコマンドラインに-zオプションを追加するだけですtar rzf 2014-12.tar.gz 2014-12-*.log。ほとんどの場合、圧縮と解凍時にCPUをほとんど使用しないため、gzipを使用することをお勧めします。このアプローチを使用すると、tarの作成時間を10〜20倍に短縮でき、ファイルシステムに書き込まれるデータの量も同じ割合で短縮できます。

また、毎日手でタールを塗ることは奇妙な考えであることを指摘したいと思います。システムがこのすべてのタスクを自動的に実行するように、一般的なlogrorateおよびcron / anacronタスクを設定することをお勧めします。

しかし、どのようなファイルシステムがありますか? (使用mount|grep $(stat --printf "%m" .)

関連情報