# 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の中華タブレットでも十分、ハングアップも気を付けて扱えばよいならマルチコアなど不要だ。
しかし、度々のハングアップで愛想が尽きたなら買い替えていいだろう。