そろそろ「May 2020 Update」こと、Windows 10 Ver.2004(以下コード名で20H1)が最終版になる。とりあえず、完成したよ的なアナウンスがあった。
20H1における最大の変更点は、Linuxカーネルを使うWSL2(Windows Subsystem for Linux 2)だ。そこで今回は、WSL1とWSL2を比較してみることにした。WSL2ではLinuxカーネルが仮想HDD上でネイティブのファイルシステムを動作させる。このため、NTFSの上でLinuxのファイルシステムをエミュレートしていたWSL1のVolFs(あるいはlxfx)に比較してファイル処理などが高速化するという。
その一方で、WSL2では仮想マシン環境でLinuxカーネルを起動させるためオーバーヘッドがある。また、WSL2からNTFS側をアクセスするには、9Pと呼ばれるネットワークプロトコルが用いられる。これにより、WSL2側からWindowsのファイルアクセスは可能になるが、ネットワークによるファイル共有と同じ仕組みであるため効率はよくない。
そこでまずは、WSL1/WSL2内部でのベンチマークでCPU性能やカーネルの機能呼び出し性能(WSL1では、WindowsがLinuxカーネルをエミレーションしている)、ファイルアクセス性能などを調べていきたい。
Linux上でのベンチマークにはどんなものがある?
Linux上でシステム性能を測定する方法はいくつかある。たとえば、/proc/cpuinfoには、bogomipsと呼ばれる値があり、これは起動時に簡易的になされるCPU速度の測定だ。ただしWSL1では、Linuxカーネルがないため、bogomipsもどうやって測定しているかハッキリしない。また、ファイルシステムのアクセス速度は、ddと呼ばれるコマンドがファイルシステム上の転送速度を表示できるため、簡易な速度測定によく使われる。
これ以上になると、ベンチマーク専用のソフトウェアを利用する必要がある。そのうち著名なものの1つがUnixBenchだ。
Unixbenchは、旧Byte誌が作成した。Byte誌は、8bitパソコンの時代にもBASICのベンチマークソフトウェアを発表していたことがある。このUnixbenchは、Unixワークステーションが普及し始めた頃に作られ、整数演算、浮動小数点演算やプロセス生成やシェルによる処理、2D/3Dグラフィックス描画性能などの測定ができる(ただしグラフィックスは、X Window Systemが前提であるため、今回は割愛した)。
ソースコードが公開されていて、現在も開発が続いており、Linuxへの対応も進められている。今回はこれを使って、WSL1とWSL2を比較してみたい。評価にはプレビュー版ビルド19041.208を用い、WSLには、Ubuntu-18.04を使った。CPUは、Core i7-3517U(クロック1.9GHz)、メモリは8GBである。
Unixbenchを実際に動かしてみる
今回はUnixbenchのうち、すべてのコアで並列に実行した。デフォルト設定では、シングルコアとマルチコアのテストを別にするのだが、時間の関係もあり、マルチコアでのテストのみとした。行ったテストは以下の表のようなものだ。Unixbenchでは、これらのテストをまとめて「system」と呼んでひとまとまりのグループとしている。デフォルトで実行されるのも、これらのベンチマークテストだ。
上の表に含まれるテストは、かつては製品同士の比較などに使われていたポピューラーなものだが、今の読者にとってはドライストーン(Dhrystone)やウェットストーン(Whetstone)など聞いたこともないという人は少なくないだろう。そこで簡単に解説しておく。
浮動小数点演算の性能を測定するためのWhetstoneベンチマークは1972年にイギリス国立物理学研究所で開発された。ウェットストーンという名称は、最初にプログラムを記述した「Whetstone Algol 60」というコンパイラーの名称に由来し、もともとはイギリスの地名であった。
Algolは、ヨーロッパ(EU統合以前の話である)が中心になって開発したコンピューター言語である。ウェットストーンは意味のある計算をするものではなく、評価対象としたKDF9というコンピューターでプログラムを実行したときの機械語命令の利用頻度を再現するようなプログラムとして作られた。つまり、ウェットストーンは当時の一般的なプログラムとほぼ同じ機械語命令を含むため、その実行結果から該当マシンのプログラムの実行速度を評価できるとされていた。
ドライストーンは、このWhetstoneに対して整数演算性能やメモリアクセスの速度を調べるために作られたプログラムで、「ウエット(湿った)」に対して「ドライ(乾いた)」という連想から名前が付けられ、Whetstoneと同じく2文字目を「h」とした。開発は1984年で、米国防省が採用したことで著名となったAdaという言語のソースコードとして公開されたが、のちにC言語に移植されUnix上で動作するものとなった。
ドライストーンが必要になったのは、浮動小数点演算ハードウェアは、メインフレームなどでは一般的だったのに対して、ミニコンやマイクロプロセッサを使ったシステムでは必ずしも搭載されておらず、ソフトウェアによる演算が一般的であり、これにウェットストーンでは適さなかったからである。
この2つは、当初はコンピューターシステムの性能を測定するという意味合いが強かったが、最近のCPUから見るとどちらも小さなプログラムであるためキャッシュに入ってしまう。そこでどちらかというとCPU性能を測定するものとして使われることが多い。かつては、コンピューター同士の比較を1秒間に実行できる命令数(MIPS値)で比較していたこともあったが、それでは最近のスーパースケーラーやアウトオブオーダー実行といった機能やCISC、RISCといった命令セットの違いなどを考慮できないため、ドライストーンで測定した値を元にしたDMIPS(Dhrystone MIPS)を使うことがある。
UnixBenchで実行する、ほかのテストとしては、Unixのシステムコール関係(syscall、pipe、context1、spawn、execl)やファイルコピー(fstime、fsbuffer、fsdisk)、シェルプログラムの実行性能がある。システムコール関係のベンチマークでは、API呼び出しのオーバーヘッドや実行ファイルからのプログラム起動、プロセスの生成などの性能を測定する。また、シェルプログラムによる簡易な実行のベンチマークでは、シェルスクリプト(sort、grep、od、tee、wcなどの基本Unixコマンドによるもの)を繰り返し実行したときの速度を測る。
このUnixbenchが広く使われたのは、1980年代からのUnixブームやその後のワークステーションブームの頃。当時GUIはすでに利用可能だったが、多くのユーザーはコンソールやターミナルウィンドウからコマンドラインで利用することが多く、こうしたベンチマークは体感性能と、さほどかけ離れていなかった記憶がある。
UnixBenchは、C言語で記述した実行プログラムをPerlから起動している。また一部のベンチマークはPerl側で行なっている。なお、UnixBenchを実行するには、ソースコードを入手し、これをコンパイルする必要がある。ただし、コンパイル手順などは煩雑になるため今回は省略させていただく。
この連載の記事
-
第461回
PC
Copilot+ PCを買ってみたが、「今焦って買う必要はない」のかもしれない -
第460回
PC
Windowsでsftpを使う -
第459回
PC
WSL 2.4.4ではtar形式でのディストリビューションが配布でき、企業での利用が容易になってきた -
第458回
PC
Windows上でhostsファイルを活用する -
第457回
PC
IPv6アドレスは先頭を見ればどんな種類かわかる -
第456回
PC
あらためてIPv6基本のキ -
第455回
PC
Windowsで現在どのネットワークアダプタがインターネット接続に使われているかを調べる方法 -
第454回
PC
Windows 11 24H2では「デバイスの暗号化」の条件が変わり、より多くのPCでドライブが暗号化される -
第453回
PC
Windows 11 24H2の配布開始後もすぐにはやってこない Windows UpdateとSafeguard Holds -
第452回
PC
Windows 11 Ver.24H2が登場 Copilot+ PCとそうでないPCで実質Windowsが2つに分かれる -
第451回
PC
新しいWindowsサンドボックスではコマンドラインからの制御が可能に - この連載の一覧へ