変奏現実

パソコンやMMORPGのことなどを思いつくまま・・・記載されている会社名・製品名・システム名などは、各社の商標、または登録商標です。

この画面は、簡易表示です

2015年5月17日

CPUのマルチコアやマルチスレッドはGUIならデフォ仕様

# top でこのブログサーバーの一瞬の動きを見てみると

top - 18:49:32 up 12:19,  1 user,  load average: 0.00, 0.01, 0.05
Tasks: 120 total,   2 running, 118 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.2 us,  0.2 sy,  0.0 ni, 99.7 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  1918224 total,   180528 free,   763520 used,   974176 buff/cache
KiB Swap:  2097148 total,  2018320 free,    78828 used.   978824 avail Mem
  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
 1422 mysql     20   0 1104484  95844   3696 S   0.7  5.0   1:30.00 mysqld
 5388 root      20   0  130032   1736   1172 R   0.7  0.1   0:00.08 top
  379 root      20   0       0      0      0 S   0.3  0.0   0:26.84 xfsaild/dm+
 5335 root      20   0       0      0      0 S   0.3  0.0   0:00.24 kworker/0:2
    1 root      20   0   56332   2452   1276 S   0.0  0.1   0:05.90 systemd
    2 root      20   0       0      0      0 S   0.0  0.0   0:00.01 kthreadd
    3 root      20   0       0      0      0 S   0.0  0.0   0:00.89 ksoftirqd/0
    5 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 kworker/0:+
    7 root      rt   0       0      0      0 S   0.0  0.0   0:00.04 migration/0
    8 root      20   0       0      0      0 S   0.0  0.0   0:00.00 rcu_bh
    9 root      20   0       0      0      0 S   0.0  0.0   0:00.00 rcuob/0
   10 root      20   0       0      0      0 S   0.0  0.0   0:00.00 rcuob/1
   11 root      20   0       0      0      0 S   0.0  0.0   0:17.52 rcu_sched
   12 root      20   0       0      0      0 R   0.0  0.0   0:13.39 rcuos/0
   13 root      20   0       0      0      0 S   0.0  0.0   0:09.46 rcuos/1
   14 root      rt   0       0      0      0 S   0.0  0.0   0:00.78 watchdog/0
   15 root      rt   0       0      0      0 S   0.0  0.0   0:00.75 watchdog/1
   16 root      rt   0       0      0      0 S   0.0  0.0   0:00.03 migration/1
   17 root      20   0       0      0      0 S   0.0  0.0   0:00.22 ksoftirqd/1
   19 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 kworker/1:+
   20 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 khelper
   21 root      20   0       0      0      0 S   0.0  0.0   0:00.00 kdevtmpfs
   22 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 netns
   23 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 writeback
   24 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 kintegrityd
   25 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 bioset
   26 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 kblockd
   27 root      20   0       0      0      0 S   0.0  0.0   0:00.01 khubd
   28 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 md
   31 root      20   0       0      0      0 S   0.0  0.0   0:00.02 khungtaskd
   32 root      20   0       0      0      0 S   0.0  0.0   0:03.83 kswapd0
   33 root      25   5       0      0      0 S   0.0  0.0   0:00.00 ksmd
   34 root      39  19       0      0      0 S   0.0  0.0   0:02.15 khugepaged
   35 root      20   0       0      0      0 S   0.0  0.0   0:00.00 fsnotify_m+
   36 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 crypto
   45 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 kthrotld
   46 root      20   0       0      0      0 S   0.0  0.0   0:00.11 kworker/u4+
   47 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 kmpath_rda+
   49 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 kpsmoused
   69 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 deferwq
  115 root      20   0       0      0      0 S   0.0  0.0   0:00.02 kauditd
  257 root      20   0       0      0      0 S   0.0  0.0   0:00.57 kworker/u4+
  258 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 ata_sff
  259 root      20   0       0      0      0 S   0.0  0.0   0:00.00 scsi_eh_0
  260 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 scsi_tmf_0
  261 root      20   0       0      0      0 S   0.0  0.0   0:00.00 scsi_eh_1
  262 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 scsi_tmf_1
  345 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 kdmflush
  346 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 bioset
  353 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 kdmflush
  354 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 bioset
  372 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 xfsalloc
  373 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 xfs_mru_ca+
※120個のプロセスが常駐し、同時に動いているのはたった2個だけ。

これはKVMホストからCPUを2個割り振っているため最大で2個になっているのだ。※J1900は2コア4スレッド構成。
本来は120個もCPUが必要なのか?と云えば、別に急がなくてもよい処理が多く、短い間隔で120分の2の比率で順に動作するだけで間に合っているのだ。
それでも、WEBのapacheやデータベースのmysqld の様に忙しいモノも混ざっているので、4~8個ぐらいCPUがあった方が応答性能があがるだろう。
スマフォやタブレットで使われてるAndroidもベースはLinuxなので、いつも1個のプロセスしか常駐していない訳では無いだろう。
本当に単純なことをさせるなら、
例えばスピーカーから50Hzの音を出すなら

10ms待ってからスピーカーの端子の電圧を0にする

10ms待ってからスピーカーの端子の電圧を1にする

フリダシに戻る

とか

フラグを0にする

インターバルタイマーを10msにセットする

フラグの内容をスピーカーの端子に送信

フラグの内容を反転する

など非常に簡単なプログラミングでできるが、いくつもの音源をミキシングするとなると、この手のプログラミングでは全く歯が立たない。
各音源のある程度の長さの出力結果を作成し、それをまとめ、インターバルタイマーで順次送信すればいいのだが、
各音源のある程度の長さの出力結果を作成する時間が希望する時間が インターバルタイマーの設定時間 を越えてしまうこともしばしば起きるだろう。そうなると、音切れが発生してしまう。
しかし、仕様書に

  • 各音源のある程度の長さの出力結果を作成する時間がインターバルタイマーの設定時間を越えそうなら、中断すること

と書いても、音源データ作成中にマメに残り時間をチェックしていたら、

残り時間を気にしている時間 >> 音源データ作成

になりかねないので、処理中断用のトリガ(割り込み)機能がCPUに必要になるだろう。
これ以外にもあれこれ音源プログラムを使うなら、予約したメモリをオーバーランして他の音源のデータを上書きしないような警報機とかも必要になるだろう。
な訳で、同様にGUIでリアルタイムに多少複雑なこと(時計を表示しながら電波強度も表示するなど)をしようとすると、タスク・スケジューリングは避けられないし、タスクを安全に使うには、割り込み機能や警報機能なども必須なものになっていく。
そうなると例え最大効率が80%でも4~8個分のCPUがあった方が高い負荷がかかったときに踏ん張りが効いてくると云うものだ。
数日ごとにアップデートを乱発するようなAndroidのアプリが多い。Wifiでアプリのアップデートをダウンロードしながら、ゲームができるくらいの性能がないと、ゲーム中にアプリのアップデートを検知しダウンロードが始まりハングアップしてしまっては、いつもゲームシステムに「回線切り逃げ」と判定されKO負けしてしまう。これを回避するには、それなりの余剰性能が必要になってしまう。
ただ、CPUの余剰性能だけでなく、RAMもそれなりに必要になるので、時々手持ちのスマフォやタブレットがハングアップになってしまう様なら、もっと高い性能のものに買い替えるしかないだろう。
ボクの場合、メモリ512MBの中華タブレットを持っていたが、これが毎日起動から30分ぐらいはAC電源接続のまま暖機運転(アプリのアップデートの確認)が必要だった。これを怠ると、タブレットの設定画面を呼び出すだけでアプリのアップデートと競合が起き確実にハングアップ。回復にはリセットするしかなので、諦めてNEXUS7に乗り換えた。
つまり、ただ持ち歩くだけで満足するならモリ512MBの中華タブレットでも十分、ハングアップも気を付けて扱えばよいならマルチコアなど不要だ。
しかし、度々のハングアップで愛想が尽きたなら買い替えていいだろう。



CPUとシステムクロックとIPC

CPUはシステムクロックが高いほど性能があがりやすい。それは大雑把にCPUが所定の命令を繰り返して処理しているからだが、それはいくつかの手順(フェーズ)に分けられる。

  1. フェッチ:メモリから命令を読む。
  2. エンコード:読み取った命令を回路の信号に変換して送り出す。この信号が届いた回路が動作する。
  3. ロード:所定のデータを読み込む。
  4. オペレーション:データに変更を加える。
  5. セーブ:所定の場所にデータを保存する。

これを単純に繰り返すと、手順が5段階も必要で、これではシステムクロックが5GHzでも、実質的なシステムのサイクルは1GHzになってしまう。しかも、手順の関連性が高く、順番通りに処理するしかないのだ。
だが、どこかの手順の間は他の手順でしか使わない回路はヒマしているのだから、次々と流れ作業を行う様に構成すれば、1つ1つの命令の結果が出てくるのは1GHz相当の時間が係るものの、5GHzで命令を読み取るので、ある程度の時間の間には5GHzで処理している様に見えるだろう。だがロードやセーブと同じ回路を使って毎回CPUの外のメモリから命令を読んでいたら、5手順のうち3手順で順番待ちが発生しせっかくのパイプラインも「たまにデータが流れていく」程度のシロモノになってしまう。パイプラインを効率的に回すにはどの手順からも手軽にアクセスできるメモリ(キャッシュ)が必要だ。いっそのことロードやセーブの手順もCPUの外のメモリはあまりアクセスせずキャッシュへのアクセスがフル回転するようにプログラミングすれば、パイプラインにはいつもデータが流れるだろう。また、処理時間が案外かかるオペレーションはパイプラインの列を増やしロードとセーブがよどみなく回る様にもできるだろう。そこまで工夫しても外部回路へのアクセス=CPUが処理した結果報告なので、低速な外部回路へのアクセスが無くなる訳では無く、1つのプログラムにCPUを独占させてもそうそう効率良く処理できないので、複数のプログラムを時分割処理をさせ順に外部回路へアクセスさせたり、CPUそのものを沢山集め複数のプログラムを並列処理させたりするのも手だ。
今のCPUはとりあえずそんな感じになっているし、CPUの種類や製造メーカーによってシステムクロックと処理速度の比率もバラバラで、「同じ系列のCPUならシステムクロックが速い方が処理速度が高そう」という目安にしかならないが、IPC(1クロックあたりに実行可能な命令数)とシステムクロックの掛け算をすればいいのかもしれない。
今時分のCPUのシステムクロック速度は停滞気味で、処理速度の向上はCPUの並列化が主な手段となっており、CPUを集合するクラスターの規模を越え、もっと巨大なクラウド(サーバーをたくさん集めたもので使っているサーバーがドレなのかは判らない)になりつつある。これは自前でサーバーを用意するなら予備機やバックアップも自前で用意しなければならないが、沢山のサーバーの塊であるクラウドなら、まだ未使用のサーバーがそれを兼ねることができるので、コストや手配の手間を低く抑えることができることが大きいのだが、それはひたすら規模拡大を突き進めている状況でありバブルな状態と云えるから、
いつかは「結局、高い買い物になってしまった。」という時がくるのだろう。




top