1. 序章

このチュートリアルでは、グラフィカル環境とコマンドライン環境の両方に対応した専用のLinuxベンチマークツールについて説明します。

さらに、特定のLinuxディストリビューションを参照していない例を示します。 このため、インストール手順はディストリビューションに依存することが多いため、さまざまなツールのインストール方法については説明しません。

2. ベンチマークとストレスの有用性

ベンチマークは、特定のタスク中のマシンのパフォーマンスを評価するのに役立ちます。 ベンチマークを使用して、2台のマシンを比較したり、コンピューターをスコアデータベースと比較したりすることもできます。

openbenchmarking.org が提供するこの例のように、Webですでに公開されているランキングを使用して、購入するハードウェアを選択できます。

システムパフォーマンスを最適化し、問題のある更新、リグレッション、バグのあるドライバーなど、ハードウェアまたはソフトウェアによって引き起こされるボトルネックを取り除くためにベンチマークが必要になる場合があります。 ベンチマークは、仮想プライベートサーバー(VPS)の特性を評価するのにも役立ちます。

ストレスは、パフォーマンスを評価するために必要がないという点でベンチマークと似ていますが、同等ではありません。 代わりに、高負荷のバグを発見し、システムの拡張性を評価するのに役立ちます。 一般に、実行時間を大幅に増やすだけで、ベンチマークをストレスツールに変えることができます

3. ハードドライブのパフォーマンスを測定する際の落とし穴

まず、ddを使用してゼロまたはランダムデータの書き込み速度をテストすることは避けましょう dd は、ほとんどすべてのLinuxディストリビューションにプリインストールされているため人気がありますが、非現実的な結果をもたらす可能性があります。 実際、一部のファイルシステムとディスクは、ゼロやその他の圧縮可能なデータの書き込みを特定の方法で処理するため、ベンチマーク結果が高すぎる原因になります。 一方、ランダムジェネレーターを使用する場合は、ディスクではなくそのジェネレーターを測定します。

また、ベンチマークの結果は次の影響を受ける可能性があることにも注意してください。

  • ファイルシステムタイプ
  • ディスク暗号化
  • キャッシングとそのプロパティ
  • 現在および以前のワークロード
  • 断片化
  • ブロックサイズ
  • 読み取り/書き込み比率
  • キューの深さ
  • データ型(例:シーケンシャルまたはランダム)
  • CPU、インターフェース、チップセットなどのハードウェアのテスト
  • オペレーティングシステムやドライバなどのソフトウェア

追加の問題は、何を測定したいかを理解することです。 ワークステーションやサーバーでは決して発生しない非現実的なエッジケースにディスクをプッシュできます。 それでも、まれなケースで有用なパフォーマンスデータが提供されることはめったにありません。 最良のベンチマーク基準は、実際のワークロードです。

また、ディスクを過度にストレスの多いベンチマークにさらさないように注意する必要があります。 すべてのディスクには書き込みに多少の摩耗があるため、同じ場所で何千回も書き込みを繰り返すテストを実行すると、寿命が短くなる可能性があります。

さらに、一部のデバイスには、内部キャッシュを使用して、ディスクに触れることなくすばやく書き換えられたデータを置き換えるインテリジェントなウェアレベリングアルゴリズムが搭載されている場合があります。 もちろん、この内部キャッシュにより、実際の結果よりも楽観的な結果が表示されます

4. ハードドライブベンチマークツール

使用するツール以外に、ディスクベンチマークの対象となる指標は次のとおりです。

  • IOPS→1秒あたりのI/O操作
  • スループットまたは帯域幅→1秒あたりに転送されるデータの量
  • レイテンシー→I/O操作の実行に必要な時間

起こりうるトラブルを想定して、いくつかのツールを試してみましょう。

4.1. hdparm

hdparmからSSDとHDDの区別についてはすでに説明しました。 hdparm は、SATA / PATA/SASおよび古いIDEストレージデバイスの低レベルパラメータを収集および操作するためのツールです。 また、パーティションがマウントされているディスクでも、-tフラグを使用して呼び出すことができるベンチマークモードが含まれています。

# hdparm -t /dev/sda
/dev/sda:
 Timing buffered disk reads: 1512 MB in  3.00 seconds = 503.87 MB/sec

このテストは、 hdparm が自動的にディスクをフラッシュするため、ファイルシステムのオーバーヘッドや事前のキャッシュなしでディスクがシーケンシャルデータ読み取りを維持できる速度を示します。

マニュアルページによると、他のアクティブなプロセスがなく、少なくとも数メガバイトの空きメモリがあるシステムで、このベンチマークを2〜3回繰り返すのが最善です。

測定を3回繰り返して、2つのディスクを比較してみましょう。 この例では、 sda はSSDであり、sdbはHDDです。

# for i in {1..3}; do hdparm -t /dev/sda; hdparm -t /dev/sdb; done

したがって、sdasdbよりも3.6倍高速であることがわかります。

/dev/sda:
 Timing buffered disk reads: 1508 MB in  3.00 seconds = 502.18 MB/sec

/dev/sdb:
 Timing buffered disk reads: 420 MB in  3.00 seconds = 140.00 MB/sec

/dev/sda:
 Timing buffered disk reads: 1510 MB in  3.00 seconds = 502.52 MB/sec

/dev/sdb:
 Timing buffered disk reads: 426 MB in  3.01 seconds = 141.39 MB/sec

/dev/sda:
 Timing buffered disk reads: 1512 MB in  3.00 seconds = 503.66 MB/sec

/dev/sdb:
 Timing buffered disk reads: 424 MB in  3.01 seconds = 140.85 MB/sec

sda (502MB / s)の値を openbenchmarking.org パフォーマンスメトリックと比較すると、最高値の中でもパフォーマンスが優れていることがわかります。

4.2. fio

fio は、Flexible I / O Testerの略で、I/Oパフォーマンスを測定するためのツールを指します。 fioを使用すると、必要なタイプの測定値を取得するようにワークロードを設定できます

–filename フラグを使用すると、 / dev /sdaなどのブロックデバイスまたはファイルのみをテストできます。 ただし、ブロックデバイスに書き込むと上書きされ、含まれるデータが使用できなくなります。 一方、 –readonlyオプションと一緒にデバイス名を安全に使用できます。

hdparmの例と同様の簡単な例から始めましょう。/dev /sda/dev /sdbの順次読み取り速度を3秒間測定します。 ( –runtime = 3 )。 テストに–name という名前を付け、 –rw はシーケンシャル( –rw = read )またはランダムI/Oアクセスのどちらかを決定します。

# fio --filename=/dev/sda --readonly --rw=read --name=TEST --runtime=3

出力は非常に冗長ですが、次の行に関心があります。

read: IOPS=128k, BW=498MiB/s (523MB/s)(1496MiB/3001msec)

帯域幅(523MB / s )は、 hdparm 502MB / s )の帯域幅と非常によく似ています。 / dev / sdb でも、hdparmの141MB / sと比較して、147MB/sの帯域幅で同じことがわかります。

–rwのすべてのオプションを見てみましょう。

  • 読み取り→順次読み取り
  • 書き込み→順次書き込み
  • randread→ランダム読み取り
  • randwrite→ランダム書き込み
  • rw readwrite→混合シーケンシャル読み取りと書き込み
  • randrw→ランダムな読み取りと書き込みの混合

fio のオプションとそれらの可能な組み合わせは、manページに示されているように、多くの場合、混乱を招く可能性があります。 そのため、 Oracleは、最も一般的なシナリオをカバーする、ブロックボリュームパフォーマンステスト用のサンプルFIOコマンドを公開しました。

関心のあるワークロードが見つかったら、コマンドラインオプションを使用せずに、ジョブファイルでテストできます。 したがって、前の例をtest.fioに保存できます。

[global]
runtime=3
name=TEST
rw=read
	
[job1]
filename=/dev/sda

安全性を高めるために、オプションで –readonly を追加して、テストを再度実行できます。

# fio --readonly test.fio

よりユーザーフレンドリーな環境で実際の結果を確認してみましょう。

4.3. gfio

gfio は、fio用のGTK+ベースのGUIフロントエンドです。 / dev / sda にアクセスする場合など、場合によっては、 fio と同様に、正しく機能するためにroot権限が必要になる場合があります。 詳細なレポートとチャートに加えて、ジョブファイルを自動的に生成または変更するためのエディターを提供します。

次のスクリーンショットは、上記の test.fio を使用したものですが、仮想マシンからのものです。

ホストと比較して、 / dev /sdaにインストールされたこの仮想マシン内のパフォーマンスは55% d低下します。 たとえば、帯域幅は523MB/sから237MB/sに低下し、読み取りIO操作の合計は1496MiB/3001msecから677MiB/3001msecに低下し、IOPSは128k/sから57.8k/sに低下しました。

fiogfioの両方が提供する他のすべての情報については、この包括的なドキュメントを参照できます。

4.4. sysbench

sysbench は、パラメーターを評価するためのモジュール式のクロスプラットフォームのマルチスレッドベンチマークツールであり、集中的な負荷の下でデータベースを実行するために重要です。 幸い、 sysbenchはオペレーティングシステムと直接対話するため、特定のデータベースから独立しています。

まず、I/Oターゲットとして一連のテストファイルを作成する必要があります。 この目的のために、sysbenchfileioパラメーターを使用してI/Oテストを実行します。 –file-total-size フラグは、ローカルで作成されるテストファイルの合計サイズを示します。 実際の実行の前にprepareを実行します。

$ mkdir tempBenchmarkFiles
$ cd tempBenchmarkFiles
$ sysbench fileio --file-total-size=50G prepare

この例では、ツールはそれぞれ約400MBの128個のファイルを作成し、ゼロで埋めます。 次に、実際にディスクベンチマークを実行できます。

たとえば、ランダムな読み取り/書き込みワークロードを実行してみましょう。

$ sysbench --file-total-size=50G --file-test-mode=rndrw --file-extra-flags=direct fileio run
sysbench 1.0.18 (using system LuaJIT 2.1.0-beta3)
 
Running the test with following options:
Number of threads: 1
Initializing random number generator from current time
 
 
Extra file open flags: directio
128 files, 400MiB each
50GiB total file size
Block size 16KiB
Number of IO requests: 0
Read/Write ratio for combined random IO test: 1.50
Periodic FSYNC enabled, calling fsync() each 100 requests.
Calling fsync() at the end of test, Enabled.
Using synchronous I/O mode
Doing random r/w test
Initializing worker threads...
 
Threads started!
 
 
File operations:
    reads/s:                      1310.23
    writes/s:                     873.52
    fsyncs/s:                     2796.86
 
Throughput:
    read, MiB/s:                  20.47
    written, MiB/s:               13.65
 
General statistics:
    total time:                          10.0194s
    total number of events:              49791
 
Latency (ms):
         min:                                    0.06
         avg:                                    0.20
         max:                                   22.64
         95th percentile:                        0.45
         sum:                                 9960.44
 
Threads fairness:
    events (avg/stddev):           49791.0000/0.00
    execution time (avg/stddev):   9.9604/0.00

–file-extra-flags = direct オプションは、sysbenchに直接I/Oを使用するように指示します。これにより、ページキャッシュがバイパスされます。 この選択により、テストがメインメモリではなくディスクと相互作用することが保証されます。 –time フラグを使用して、期間を秒単位で設定することもできます。

–file-test-mode は、次のワークロードを受け入れます。

  • seqwr→順次書き込み
  • seqrewr→シーケンシャルリライト
  • seqrd→順次読み取り
  • rndrd→ランダム読み取り
  • rndwr→ランダム書き込み
  • rndrw→ランダム読み取り/書き込みの組み合わせ

最後に、一時ファイルを削除しましょう

$ sysbench fileio cleanup

マニュアルページは少し簡潔です。 また、包括的なマニュアルであるsysbench-manual.pdfを詳しく調べることもできます。

5. CPUベンチマーク

CPUベンチマークの中心的な側面は、の実行時間を測定する計算を選択することです。 理論的には、特定のソフトウェアは必要ありません。

たとえば、同じソフトウェアを異なるマシンでコンパイルしたり、何百もの重いファイルをハッシュして時間を比較したりすることができます。 もちろん、境界条件は同じである必要があります。オペレーティングシステム、ファイル、コンパイルまたはハッシュに使用されるオプションなどです。 さらに、いくつかの計算を100万回繰り返す小さなBashスクリプトを作成することもできます。 ただし、このアプローチは、特定のタスクに関心がある場合にのみ有効です。

より一般的なCPUテストについては、Geekbenchは非常に完全なようです。 これは、次のシングルコアおよびマルチコアテストに対してCPUをテストするコマンドラインツールです。

  • AES-XTS
  • テキスト圧縮
  • 画像圧縮
  • ナビゲーション
  • HTML5
  • SQLite
  • PDFレンダリング
  • テキストレンダリング
  • Clang
  • カメラ
  • N-Body Physics
  • 剛体物理学
  • ガウスぼかし
  • 顔検出
  • 地平線検出
  • 画像の修復
  • HDR
  • レイトレーシング
  • 運動からの構造
  • 音声認識
  • 機械学習

これは、無料バージョンのプロプライエタリソフトウェアです。 ベンチマークの最後に、Geekbenchは結果をオンラインでアップロードし、このようなリンクを提供して結果を表示します。

次に、CPUをGeekbenchベンチマークデータベースと比較できます。 ここでも、openbenchmarking.orgパフォーマンスメトリックと比較することができます。スクリーンショットに示されている結果は非常に低いことに注意してください。

6. GPU機能

ビデオカードのパフォーマンスを評価することは、ほとんどゲームにのみ役立つと考える人もいるかもしれません。 そうではありません。

たとえば、拡張現実(AR)や仮想現実(VR)への没頭について考えてみましょう。 適切なVRヘッドセットや最も効果的なARソフトウェアを選択するだけでなく、完璧なVR体験を構築することもできます。 真にリアルなVR体験を確実に得るために不可欠なツールの1つは、GPUです。

また、人工知能(AI)のサブセットである機械学習(ML)についても考えることができます。 MLは、観測とデータから意思決定と予測を行うことを学習するコンピューターシステムの機能です。 GPUは、数学的計算機能が強化された特殊な処理ユニットであり、MLに最適です。

もう1つの興味深い例は、ビットコインやイーサリアムなどの暗号通貨のマイニングです。 マイニングは、トランザクションのブロックを作成し、それをブロックチェーンに追加するプロセスです。 優れたグラフィックカードなど、複雑な数学的パズルを解くための専用ハードウェアが必要です。 たとえば、イーサリアムコインをマイニングするためのVRAM(ビデオRAM)の要件は4GB以上です。 ただし、これは最小要件にすぎません。

これらの観察から、特定のタスクを実行することを計画している場合、GPUベンチマークでは不十分であることは明らかです。 ここで提案する例では、必要なハードウェアを徹底的に調査する必要があります。

7. GPUベンチマーク

通常、GPUベンチマークには、多かれ少なかれ複雑な動画のオンザフライ作成と1秒あたりのフレーム数(fps)の測定が含まれます。

一般的に、 fps値が高いほど、は優れています。 高い値は、ビデオカードが特に問題なく3Dシーンをレンダリングできることを意味します。 低い値は、グラフィック作業の複雑さがビデオカードには大きすぎることを意味します。 人間の目には、60fpsの映画が望ましいです。

ベンチマークスコアが低いからといって、GPUに障害があるとは限らないことを覚えておいてください。 古いドライバー、プロプライエタリドライバーの代わりにオープンソースドライバー(またはその逆)、過熱、または電源の問題により、スコアが低くなる可能性があります。

7.1. glmark2

glmark2 には、 OpenGL(ES)2.0のパフォーマンスの多くの側面を測定するための一連のシーンがあります。 一連のオプションを使用して、各シーンのレンダリング方法を構成できます。 テストを完了してスコアを提供するには、数分かかります。 シーンの1つは次のとおりです。

仮想マシンの1つで、この包括的なテストにより、次のログと最終スコアが提供されました。

$ glmark2
=======================================================
    glmark2 2014.03+git20150611.fa71af2d
=======================================================
    OpenGL Information
    GL_VENDOR:     VMware, Inc.
    GL_RENDERER:   SVGA3D; build: RELEASE;  LLVM;
    GL_VERSION:    2.1 Mesa 20.0.8
=======================================================
[build] use-vbo=false: FPS: 615 FrameTime: 1.626 ms
[build] use-vbo=true: FPS: 2364 FrameTime: 0.423 ms
[texture] texture-filter=nearest: FPS: 1567 FrameTime: 0.638 ms
[texture] texture-filter=linear: FPS: 1546 FrameTime: 0.647 ms
[texture] texture-filter=mipmap: FPS: 1525 FrameTime: 0.656 ms
[shading] shading=gouraud: FPS: 1563 FrameTime: 0.640 ms
[shading] shading=blinn-phong-inf: FPS: 1491 FrameTime: 0.671 ms
[shading] shading=phong: FPS: 1338 FrameTime: 0.747 ms
[shading] shading=cel: FPS: 1334 FrameTime: 0.750 ms
[bump] bump-render=high-poly: FPS: 1443 FrameTime: 0.693 ms
[bump] bump-render=normals: FPS: 1395 FrameTime: 0.717 ms
[bump] bump-render=height: FPS: 1279 FrameTime: 0.782 ms
[effect2d] kernel=0,1,0;1,-4,1;0,1,0;: FPS: 1420 FrameTime: 0.704 ms
[effect2d] kernel=1,1,1,1,1;1,1,1,1,1;1,1,1,1,1;: FPS: 1427 FrameTime: 0.701 ms
[pulsar] light=false:quads=5:texture=false: FPS: 610 FrameTime: 1.639 ms
[desktop] blur-radius=5:effect=blur:passes=1:separable=true:windows=4: FPS: 247 FrameTime: 4.049 ms
[desktop] effect=shadow:windows=4: FPS: 220 FrameTime: 4.545 ms
[buffer] columns=200:interleave=false:update-dispersion=0.9:update-fraction=0.5:update-method=map: FPS: 184 FrameTime: 5.435 ms
[buffer] columns=200:interleave=false:update-dispersion=0.9:update-fraction=0.5:update-method=subdata: FPS: 233 FrameTime: 4.292 ms
[buffer] columns=200:interleave=true:update-dispersion=0.9:update-fraction=0.5:update-method=map: FPS: 235 FrameTime: 4.255 ms
[ideas] speed=duration: FPS: 668 FrameTime: 1.497 ms
[jellyfish] <default>: FPS: 1734 FrameTime: 0.577 ms
Error: SceneTerrain requires Vertex Texture Fetch support, but GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS is 0
[terrain] <default>: Unsupported
[shadow] <default>: FPS: 1023 FrameTime: 0.978 ms
[refract] <default>: FPS: 868 FrameTime: 1.152 ms
[conditionals] fragment-steps=0:vertex-steps=0: FPS: 1715 FrameTime: 0.583 ms
[conditionals] fragment-steps=5:vertex-steps=0: FPS: 1463 FrameTime: 0.684 ms
[conditionals] fragment-steps=0:vertex-steps=5: FPS: 1425 FrameTime: 0.702 ms
[function] fragment-complexity=low:fragment-steps=5: FPS: 1432 FrameTime: 0.698 ms
[function] fragment-complexity=medium:fragment-steps=5: FPS: 1405 FrameTime: 0.712 ms
[loop] fragment-loop=false:fragment-steps=5:vertex-steps=5: FPS: 1357 FrameTime: 0.737 ms
[loop] fragment-steps=5:fragment-uniform=false:vertex-steps=5: FPS: 1269 FrameTime: 0.788 ms
[loop] fragment-steps=5:fragment-uniform=true:vertex-steps=5: FPS: 1311 FrameTime: 0.763 ms
=======================================================
                                  glmark2 Score: 1178 
=======================================================

openbenchmarking.org で報告された800×600ピクセルのパフォーマンスメトリックに基づくと、このスコアは低すぎて適切なパフォーマンスにはなりません。 比較すると、スコアの中央値は3172であり、中間層のスコアは7765です。

7.2. geeks3d’s GpuTest

geeks3dのGpuTestは、クロスプラットフォームのフリーウェアOpenGLベンチマークです。 いくつかのGPUベンチマーク(furmark、gimark、pixmarkなど)と徹底的なREADME.txtが含まれています。

次のスクリーンショットは、pixmarkベンチマークの例です。 タイトルバーにはfpsがリアルタイムで表示されることに注意してください。 テストが終了すると、スコアも表示されます。これは、この更新されたスコアデータベースと比較できます。

この場合、ファーマークスコアは2833です。

結果をtop-20スコア(85324〜180278)と比較すると、GPUには厳しい制限があることがわかります。

8. RAMベンチマーク

同じタイプのメモリースティックが2台の異なるマシンで同じように機能すると考えることもできますが、そうなることはめったにありません。 RAMのパフォーマンスは、メモリの種類や速度よりもCPUとマザーボードに大きく依存します。 一方、RAMの量は、一般的なシステムパフォーマンスの決定要因です。

それを念頭に置いて、RAMをsysbenchでベンチマークしてみましょう。

8.1. sysbench

デフォルトでは、 –memory-oper = read を使用しない限り、ツールは書き込みテストを実行します。

$ sysbench memory --memory-access-mode=rnd run
sysbench 1.0.18 (using system LuaJIT 2.1.0-beta3)

Running the test with following options:
Number of threads: 1
Initializing random number generator from current time
 
 
Running memory speed test with the following options:
  block size: 1KiB
  total size: 102400MiB
  operation: write
  scope: global
 
Initializing worker threads...
 
Threads started!
 
Total operations: 20126299 (2012308.75 per second)
 
19654.59 MiB transferred (1965.15 MiB/sec)
 
 
General statistics:
    total time:                          10.0001s
    total number of events:              20126299
 
Latency (ms):
         min:                                    0.00
         avg:                                    0.00
         max:                                    0.04
         95th percentile:                        0.00
         sum:                                 8260.00
 
Threads fairness:
    events (avg/stddev):           20126299.0000/0.00
    execution time (avg/stddev):   8.2600/0.00

–memory-access-mode に指定できる値は、 seq (デフォルトでは順次アクセス)および rnd (ランダムアクセス)です。 すべてのオプションを表示するには、sysbenchメモリヘルプを使用できます。

8.2. RAMベンチマークの比較

以前に取得した値(1965.15 MiB /秒)を[X97X]パフォーマンスメトリックの openbenchmarking.org と比較すると、結果は最小値を下回っているように見えます。 ただし、 openbenchmarking.org の値は、 sysbench memoryrunで実行できる順次書き込み専用テストを参照している可能性があります。 その場合、中央値に非常に近い5847.83MiB/秒が得られます。

さらに、仮想マシンのRAMパフォーマンスがホストのRAMパフォーマンスよりも低いかどうかを評価できます。

$ sysbench memory --memory-access-mode=rnd run
sysbench 1.0.11 (using system LuaJIT 2.1.0-beta3)
 
Running the test with following options:
Number of threads: 1
Initializing random number generator from current time
 
 
Running memory speed test with the following options:
  block size: 1KiB
  total size: 102400MiB
  operation: write
  scope: global
 
Initializing worker threads...
 
Threads started!
 
Total operations: 17710992 (1770824.00 per second)
 
17295.89 MiB transferred (1729.32 MiB/sec)
 
 
General statistics:
    total time:                          10.0001s
    total number of events:              17710992
 
Latency (ms):
         min:                                  0.00
         avg:                                  0.00
         max:                                  1.02
         95th percentile:                      0.00
         sum:                               7772.77
 
Threads fairness:
    events (avg/stddev):           17710992.0000/0.00
    execution time (avg/stddev):   7.7728/0.00

この場合、かなりわずかな(10%)劣化が見られます。

9. 結論

このチュートリアルでは、ハードディスク、CPU、GPU、およびRAMのパフォーマンスを測定するためのいくつかのツールについて説明しました。 テストを実行する前に、実際のワークロードと何を測定するかを想像する必要があります。

このようにして、コンピューターの弱点や構成の誤りを発見できます。 また、VPSなどのレンタルマシンの実際のパフォーマンスを比較して見積もることもできます。