本日も乙

ただの自己満足な備忘録。

脳内ロードアベレージを下げてパフォーマンスを向上させる

やりたいことがあるのに、やらなければならないことが多くて気持ち的に良いパフォーマンスを発揮できていないことがあります。Todoリストには常に緊急度が高く重いタスクが鎮座している状態です。

そんなタスクをとっととやっつければいいのですが、腰が重いものが多く、Slack(チャットツール)でのメンションやミーティングで集中できる時間がとれず、片付けるのがやっと。

 
ネットスラングに「毛根タイム」というのがあります。「もうこん(毛根)な時間だ」という意味です。楽しく集中できて時間が経過するのは良いのですが、なにかに気を取られて気が付けば一日が終わってしまうことがあります。

 
なぜパフォーマンスが落ちているのかというと、割り込みなどによって認知コストを取られてしまっているから。その場で返したりちょこっとしたタスクならその場でやってしまいがちですが、割り込みタスクから帰ってきたときに本来やっていたことを思い出して再会するまでに時間がかかります。複数のタスクを切り替えながら同時にこなすことを「コンテキストスイッチ」と言います。コンテキストスイッチが発生した場合、コンピュータは高速かつ正確に切り替えられますが、人間の場合は集中のし直しとやっていたことの思い出しが発生するため、パフォーマンスが低下します。

ロードアベレージとは

コンピュータの負荷を表す指標として「ロードアベレージ」というのがあります。CPUは1コアあたり1つのタスク(=アプリケーションの実行やマウス・キーボードの入力など)しか実行できず、瞬間瞬間でタスクを切り替えることで多数のプログラムを同時に実行している(ように見える)のです。ロードアベレージの数値が高ければ高いほど、負荷が高いつまりコンピュータが忙しいことを表しています。

人間に例えると、CPU=頭脳です。コンピュータはCPUコア数が頭脳の数になりますが、人間は頭脳は一つしかありません。そのためロードアベレージが1(頭脳の数)以上になると、コンテキストスイッチが発生することになります。コンピュータ同様、ロードアベレージが高ければ高いほど忙しくなりパフォーマンスが低下します。

 
ITエンジニアは監視システムによってコンピュータ(サーバ)のロードアベレージを監視して数値が高い場合に、原因調査して対応を行います。人間の場合も、一つのシステムとして捉えてロードアベレージを監視し、数値が高いときに適切な対応を行うことでパフォーマンスを向上させることができるのではないかと考えています。

どのようなときにロードアベレージが上がるか

先ほど触れたように、コンピュータが多くのタスクを同時に処理しようとするときにロードアベレージがあがります。具体的には以下のような状況です。

  • 重いプログラムを実行する: 大量のデータを処理する、大きなファイルを圧縮したりビデオエンコーディングなどCPUを多く使う処理など。
  • 多くの人が同時にサービスを利用する: 販売開始直後のチケットサイトやソーシャルゲームなど、瞬間的に多くの人が同時にアクセスするとき。
  • ディスクへの読み書き(I/O)で待ちが発生する: 大量のデータをデータベースに読み書きする場合。I/O待ちはCPU使用率は下がりますが、処理は完了していないためロードアベレージは下がらない。

人間に例えると、以下のような状況です。

  • 重いタスクを実行する: 完了するのに何時間もかかるようなタスクをこなす場合。
  • 複数人から同時に仕事の依頼がくる: ちょっとしたタスクであっても複数人から同時に依頼がくると、一つずつ処理していくため時間がかかる。
  • 待ち状態が発生する: タスクを手離れできず、宙ぶらりんになってしまう場合。

ロードアベレージを下げるには

サーバのロードアベレージが高い場合、まずは先ほどのロードアベレージが上がる要因が発生していないかを調査します。原因を特定できたら適切な対応を行います。
先ほどの例をあげると、次のような対応をとります。

  • 重いプログラムが実行されている: タスクを終了させるかプログラム内で処理が重くなっている箇所をさらに調査する
  • 同時に大量のアクセスが発生している: 処理するサーバを増やす(スケールアウト)、ウェブサーバのチューニング、待ち行列(キューイング)を導入する
  • I/O待ち: データベースのパラメータチューニング、DBサーバのCPU・メモリを増やす(スケールアップ)

人間の場合は、次のような対応になるでしょう。

  • 重いタスク: スモールタスクに分割、他の人と分担もしくは任せる
  • 複数人から同時に仕事の依頼がくる: Todoリストに一旦移す、他の人に任せる
  • 待ち状態が発生する: Todoリストに移して忘れる

 
人間とコンピュータの共通点は、「分散」と「キューイング」です。分散は、コンピュータの場合は処理する台数を増やす(スケールアウト)、人間の場合は作業の分担です。一人あたりの作業量を減らし高速に処理を行うことで、ロードアベレージを下げることができます。キューイングは、チケットサイトでは待機室(〇〇人待機中)のようなイメージです。人間の場合は、仕事の依頼がきたらTodoリストに一旦投げて忘れることで脳内メモリを解放します。

人間にできて、コンピュータにできないことは「移譲(任せる)」です。他の人にもできる作業であれば、他人に任せて自分にしかできないことに専念するのが良いでしょう。

まとめ

人間をコンピュータと捉えることで、負荷が高い状態とその対応について考えてみました。