遅延のないローカルコンパイル

要約 :cgroupを使用して、プロセッサとディスクごとにコンパイラの速度を制限します。



歌詞



与えられた:

1個のプログラマー、

5200 rpmラップトップディスクを搭載したラップトップ-1個

Haskellソースファイル300個

コーヒースクリプトファイル(将来のJS)-300個

コンパイル時間-40分。



目的:システム全体を「地獄と死」の状態にせずにバックグラウンドでコンパイルする。 アセンブリ時間を最大で50〜60分増やすこともできます。



解決策?

cgroups

ラップトップのディスクパフォ​​ーマンスは(目で見て)およそ80 IOPSのピーク時です。 コンパイルに40 IOPSと300%CPU(全プロセッサーの75%)を提供することにしました。



その後、すべてが簡単です:

sudo -s mkdir -p ~/cg/io mkdir -p ~/cg/cpu mount -t cgroup -oblkio none ~/cg/io mount -t cgroup -ocpu none ~/cg/cpu mkdir ~/cg/cpu/g1 ( ) stat /dev/sda
      
      





(デバイスタイプにのみ関心があるという結論が得られます: 8.0 、太字で強調表示されている-望ましいもの)



次に2番目のシェルを起動し、そこからコンパイルを行います。 PIDを確認します。

 echo $$
      
      





(番号を取得)



最初のシェルで記述します:

 echo (PID   ) >~/cg/g1/cpu/tasks echo (PID   ) >~/cg/io/tasks
      
      





(これは、どのpidとその子孫をカットするかということで、そこに複数のプロセスを書き込むことができますが、コンパイルのためには、シェル化するだけで十分です)

次に、制限を設定します。



IO

 echo "8:0 20" > ~/cg/io/blkio.throttle.read_iops_device echo "8:0 20" > ~/cg/io/blkio.throttle.write_iops_device
      
      





8:0デバイスの場合(それを見つける方法については上記を参照)、1秒あたり最大20のレコードと20の読み取り値を設定します。



CPU

 echo 300000 > ~/cg/cpu/g1/cpu.cfs_quota_us
      
      







300,000 µs(100,000 µsのティックごとに)、つまり300%CPUのクォータを設定します。



その後、シェルでコンパイルを安全に実行できます(PIDをタスクに書き留めました)-使用可能なすべてのリソースを消費しなくなり、スローダウンしてビープ音が鳴ります。



ところで、値は外出先でも変更できます。



All Articles