web-dev-qa-db-ja.com

CPUとIOのプロセス優先度が異なるユースケース?

Linuxプロセスは異なるCPUとIO優先度(ニースとイオニス)を持つことができます。

異なるCPUとIO優先度)が必要なのはなぜですか?

それらを異なるものにするための実際の使用法はありますか?

異なるCPUとIO優先度)が必要な実際のユースケースは何ですか?通常のCPU優先度よりも高いが、通常よりも低いIO優先度またはその逆。

9
Eduardo

'Nice'のデフォルトの動作は、nicenessが変更された場合にも、アプリケーションの 'io'優先度を調整することです。

もちろん、すべてはワークロードに依存しますが、オペレーティングシステムの重要な側面の1つは、リソースの割り当て方法と、競合の処理方法です。

競合するプロセスからの負荷がかかると、オペレーティングシステムの動作が残りのワークロードに影響を与える可能性があるため、優れている点を理解することは実際に重要です。

競合は、さまざまなアプリケーションが同じリソース(CPUなど)をめぐってどのように競合するかを示す尺度です。

負荷の処理

完全に公平なスケジューラが導入されて以来、Niceは各プロセスの「重み」句のフロントエンドにすぎません。これはprocで見ることができます。

$ cat /proc/self/sched
---------------------------------------------------------
...
se.load.weight                     :                 1024
...

優しさを変えることは単に体重を変えるだけです:

$ Nice -n 5 cat /proc/self/sched 
---------------------------------------------------------
...
se.load.weight                     :                 335
...

CPU競合の測定は、完全に公平なスケジューリングアルゴリズムによって行われます。すべてのアプリケーションには「重み」値が割り当てられ、CPU時間が競合する場合は、CPU時間について競合するすべての処理を合計し、重み値に基づいて最小の共通単位CPU時間を割り当てることにより、時間がプロセス間で分割されます。

3つのアプリケーションがすべてCPU時間を使用したい場合、デフォルトでは、それらは通常の重みとして1024を受け取ります。上記のようにNice + 5のプロセスが1つある場合、3つの重みはすべて合計2383になります。したがって、3つのプロセスすべてがその秒にCPUを要求している場合、niceedプロセスは特定の秒に約15%のCPU時間を受け取ります。 。

異なるCPUとIO優先度)が必要なのはなぜですか?

優れている点は、実際には、システムに負荷がかかっているときに何をするか、つまり、必要な要素によって定義されるように、オペレーティングシステムが競合するプロセス間で時間をスライスする方法だけです。

これがあなたにどのように影響するか、またはあなたに関連するかは、さまざまなアプリケーションが相互に持つ配信の優先順位と、各アプリケーションを配信するための時間によって決まります。

ニースネスは、実際には、システムに負荷がかかっているときにのみ何かを実行します(CPUまたはディスクが処理できるよりも注意が必要なものがたくさんあります)。そのような状況でリソースを割り当てる方法をカーネルに指示するだけです。

それらを異なるものにするための実際の使用法はありますか?

CPUで実行できる以上の競合するプロセスや実行する作業が多数ある場合は、どの作業が最初に終了するかについて、比較的安定した保証が得られます。別のレポートが終了する前に配信する必要があるレポートを作成すると言う場合、これは重要な場合があります。

デスクトップシステムでは、快適さがさらに重要になる可能性があります。特定のアプリケーションにはリアルタイムの動作があり、ロード中に頻繁にウェイクアップされることで、データが古くなるのを防ぎます。たとえば、Pulseaudioはこのカテゴリに分類されます。

依存するアプリケーションの作業を行うために、他のアプリケーションが必要になる場合があります。たとえば、MySQLのようなSQLサーバーが長期間ブロックする可能性があるというApacheリクエストの多くは、SQLが十分な速度で提供されていないためです。たとえば、他のレポートがCPU時間を競合しているとしましょう。したがって、SQLが停止するだけでなく、Apacheも停止します。 SQLは、通常、スケジューラーによってより有利に評価されるグループとして競合するApacheスレッドよりもはるかに少ないワーカースレッドがあるため、SQLに悪影響を与える可能性があります。そのため、SQLにより多くのCPU時間を与えることで問題が解決します。

UpdateDB(ファイルにインデックスを付けるプログラム)は深夜に実行され、ディスクが非常に重いです。 IOスケジューリングの優先度を下げて、その時点で他のアプリケーションが、物事の順序でそれほど重要ではないものよりも優先されるようにすると便利な場合があります。

異なるCPUとIO優先度)を必要とする実際のユースケースは何ですか?

非常に少ない。優しさは、ベストエフォートのアプローチではありません。経験則として、私はアプリケーションのパフォーマンスの良さや more アプリケーションの可能性のパフォーマンスの悪さについてはあまり気にしません。これは最初は逆に聞こえるかもしれませんが、私にとってより重要なサービス提供の保証があります。

「悪い日でもX時間でやる」と自信を持って言いたいです。それが速くなるなら、それはただのボーナスです。

私は通常、次のような合意された仕様を生成することから始めます。

  • すべてのWebアプリケーションは、0.3秒でリクエストを完了することが保証されています。
  • システム上のすべてのSQL要求は、0.1秒で完了することが保証されています。
  • Webアプリケーションは50IOPS以下を処理し、1,000ファイルを配信する必要があります。
  • Webアプリケーションのメモリフットプリントは、合計で250Mb以下です。

そして、次のように満たすための要件を引き出します。

  • すべてのWebリクエストは0.05秒で完了する必要があります。
  • すべてのSQL要求は0.02秒で完了する必要があります。
  • すべての要求を処理するのに十分なメモリが必要です。
  • IO要件を満たす必要があります。

仕様が正しい場合は、コントロールグループのはるかに効率的なアプローチを使用して、仮想化を行わずにこれらの目標を達成します。

コントロールグループを使用すると、アプリケーションが指定された境界内で動作する場合に、リソース割り当てに対して非常に信頼性の高いサービスレベルの保証を行うことができます。これは、負荷がかかっているシステムでも、問題のアプリケーションのリソースの可用性を保証し、同じボックス上の他のアプリケーションのスペースを保証できることを意味します。

CPUとIOの例を見てみましょう。これらの要件を満たす制限を設定します。

# cd /sys/fs/cgroup/blkio/Apache
# echo "253:0 100" >blkio.throttle.read_iops_device 
# echo "253:0 50" >blkio.throttle.write_iops_device 
# echo "253:0 102400" >blkio.throttle.read_bps_device

したがって、100iopsの読み取りに100kバイト。

# cd /sys/fs/cgroup/cpu/Apache
# echo 1000000 >cpu.cfs_period_us
# echo 60000 >cpu.cfs_quota_us 

1秒の期間のうち、0.06秒のCPUを割り当てます。

# cd /sys/fs/cgroup/cpu/sql
# echo 1000000 >cpu.cfs_period_us
# echo 20000 >cpu.cfs_quota_us

1秒の期間のうち、0.02秒のCPUを割り当てます。

他の競合するcgroupを提供しても、愚かなことは何もしません。アプリケーションごとにCPUがどのようにスローされるかを知っているなので、負荷がかかっていることはサービス提供の要因ではありません。

この性質のコントロールグループは、 still ベストエフォートですが、優しさやイオニセネスよりもはるかに多くのコントロールを提供します。

6
Matthew Ife