Linux、macOSなどのUnix環境でCPUベンチマークツール「UnixBench」を必要パッケージごと一括インストールするシェルスクリプト(バッチ処理プログラム) ~RHEL、CentOS、Fedora、Ubuntu、macOS、Cygwinなどに対応したCPU性能評価ソフトウェア~

2月 8, 2018AWS,EC2,Programming,Shell Script

LinuxやmacOSなどの性能を比較する場合にはベンチマークツールを用いることが一般的ですが、広く多種類のOSで使用できなければ同じ基準で性能評価をすることはできません。

特に最近ではCPUのマルチコアによるマルチスレッド処理(複数同時処理)が一般的になってきており、単純にクロック周波数の数値だけでは性能評価が難しくなってきました。

そのようなマルチコアにも対応し、Linux、macOS、Cygwin(Windows)などのUnix系OSで幅広く使用できるCPUベンチマークソフトに「UnixBench」があります。

今回はUnix系OSのCPU性能評価に活用できる「UnixBench」をRHEL、CentOS、Fedora、Ubuntu、macOS、Cygwinに必要モジュールも含め、一括インストールするシェルスクリプト(バッチ処理プログラム)を紹介します。

Linux、macOSなどのUnix環境でCPUベンチマークツール「UnixBench」を必要パッケージごと一括インストールするシェルスクリプト(バッチ処理プログラム) ~RHEL、CentOS、Fedora、Ubuntu、macOS、Cygwinなどに対応したCPU性能評価ソフトウェア~

UnixBenchで測定できる主なテストケース

一括インストールのシェルスクリプト(バッチ処理プログラム)の紹介の前にUnixBenchで測定できる主なテストケースについて紹介します。

  • Dhrystone 2 using register variables [テストケース名:dhry2reg]
  • 整数演算処理の古典的なベンチマークテストDhrystoneを用いて、CPU処理性能を測定します。
    結果数値は1秒間の処理回数が表示されます。

  • Double-Precision Whetstone [テストケース名:whetstone-double]
  • 浮動小数点数演算処理の古典的なベンチマークテストWhetstoneを用いて、数値演算の処理性能を測定します。
    結果数値は1秒間の処理命令数が表示されます。

  • Execl Throughput [テストケース名:execl]
  • プロセスイメージを置き換えるexecl関数を用いてシステムコール処理性能(OS・CPUの処理性能)を測定します。
    結果数値は1秒間のシステムコール処理回数が表示されます。

  • File Copy 1024 bufsize 2000 maxblocks [テストケース名:fstime]
  • 2MBのファイルを1024Byte毎に処理するファイルの書き込みと読み込みを繰り返すテストケースでファイルコピー速度を測定します。
    ※CPU、メモリ上へのキャッシュが測定に影響するため、CPU処理性能を測定することに使用されます。
    結果数値は1秒間のファイル処理容量(KB)です。

  • File Copy 256 bufsize 500 maxblocks [テストケース名:fsbuffer]
  • 0.5MBのファイルを256Byte毎に処理するファイルの書き込みと読み込みを繰り返すテストケースでファイルコピー速度を測定します。
    ※CPU、メモリ上へのキャッシュが測定に影響するため、CPU処理性能を測定することに使用されます。
    結果数値は1秒間のファイル処理容量(KB)です。

  • File Copy 4096 bufsize 8000 maxblocks [テストケース名:fsdisk]
  • 8MBのファイルを4096Byte毎に処理するファイルの書き込みと読み込みを繰り返すテストケースでファイルコピー速度を測定します。
    ※CPU、メモリ上へのキャッシュが測定に影響するため、CPU処理性能を測定することに使用されます。
    結果数値は1秒間のファイル処理容量(KB)です。

  • Pipe Throughput [テストケース名:pipe]
  • 512Byte単位でデータを繰り返しパイプ処理するスループットを計測してCPU・OSの処理性能を測定します。
    結果数値はパイプ処理回数です。

  • Pipe-based Context Switching [テストケース名:context1]
  • プロセス間通信で更新されるデータをパイプ処理する際のコンテキストスイッチングでCPU・OSの処理性能を測定します。
    結果数値はパイプ処理回数です。

  • Process Creation [テストケース名:spawn]
  • プロセスのフォークを繰り返すテストケースでCPU・OSの処理性能を測定します。
    結果数値はフォーク処理回数です。

  • System Call Overhead [テストケース名:syscall]
  • プロセスIDを返却するgetpid関数を用いてシステムコール処理性能(OS・CPUの処理性能)を測定します。
    結果数値は1秒間のシステムコール処理回数が表示されます。

  • Shell Scripts (1 concurrent) [テストケース名:shell1]
  • シェル(/bin/sh)でsort, od, grep, tee, wc, rmコマンド、パイプ・リダイレクトによるファイル処理を行うテストシェルスクリプトを1個ループ実行してCPU・OSの処理性能を測定します。
    結果数値はループ処理回数です。

  • Shell Scripts (8 concurrent) [テストケース名:shell8]
  • シェル(/bin/sh)でsort, od, grep, tee, wc, rmコマンド、パイプ・リダイレクトによるファイル処理を行うテストシェルスクリプトを8個同時にループ実行してCPU・OSの処理性能を測定します。
    結果数値はループ処理回数です。

  • Shell Scripts (16 concurrent) [テストケース名:shell16]
  • シェル(/bin/sh)でsort, od, grep, tee, wc, rmコマンド、パイプ・リダイレクトによるファイル処理を行うテストシェルスクリプトを16個同時にループ実行してCPU・OSの処理性能を測定します。
    結果数値はループ処理回数です。

Linux、macOSなどのUnix環境でCPUベンチマークツール「UnixBench」を必要パッケージごと一括インストールするシェルスクリプト(バッチ処理プログラム)

基本方針としては各OSに合わせてUnixBenchの実行に必要なモジュールをインストールし、UnixBenchやパッチをダウンロードしてビルドし、テストを実行します。

シェルスクリプト(バッチ処理プログラム)の処理の流れとしては、まずOSに合わせたコマンドで必要モジュールをインストールします。

LinuxのうちRHEL、CentOS、Fedoraなどyumコマンドが存在すればyumでパッケージインストールし、yumコマンドがなければdnfコマンドでインストールを試みます。
※Fedora 22でyumコマンドは廃止となりdnfコマンドが採用されました。そのため将来的にRHEL8、CentOS8などでもyumコマンドが廃止され、dnfコマンドが採用される可能性が非常に高いです。

LinuxのうちUbuntuなどapt-getコマンドが存在すればapt-getでパッケージインストールします。

また、macOSは専用のパッチを当てる必要があるため、パッチをダウンロードして適用します。

UnixBenchをインストールした後は「./Run -i 5 pipe」でCPUのPipe Throughputのみを計測します。

必要に応じて「./Run -i 5 pipe」の引数部分を自分の好きなテストケース名に変更して使用します。

全てのベンチマークを実行する場合は「./Run」を実行するように書き換える必要がありますが、全てのベンチマークの計測にはかなりの時間を要しますのでご注意ください。

初回のUnixBenchのインストール以降は計測コマンドのみを実行するので繰り返して使用するベンチマークコマンドとして使用できます。

[root@localhost ~]# vim unixbench_installer_and_run.sh
#!/bin/bash

#UnixBenchを配置するディレクトリ
UNIX_BENCH_DIR=/usr/local

cd ${UNIX_BENCH_DIR}/

if [ ! -d ${UNIX_BENCH_DIR}/UnixBench ]; then

  if [ "$(uname)" == 'Darwin' ]; then
    echo "OS: Mac"
    #macOSの場合、必要なインストールパッケージがあればここにbrewなどインストールコマンドを記載する。
  elif [ "$(expr substr $(uname -s) 1 5)" == 'Linux' ]; then
    echo "OS: Linux"

    #RHEL, CentOS, Fedoraの場合
    which yum > /dev/null 2>&1
    IS_PKG=$?
    IS_PKG=`echo "${IS_PKG}" | sed 's/ //g' | sed 's/\t//g' | tr -d '\n'`
    if [ "${IS_PKG}" = "0" ]; then
      yum install -y gcc make perl perl-Time-HiRes
    else
      #yumコマンドが廃止されていればdnfコマンドでインストールする。
      which dnf > /dev/null 2>&1
      IS_PKG=$?
      IS_PKG=`echo "${IS_PKG}" | sed 's/ //g' | sed 's/\t//g' | tr -d '\n'`
      if [ "${IS_PKG}" = "0" ]; then
        dnf install -y gcc make perl perl-Time-HiRes
      fi
    fi

    #Ubuntuの場合
    which apt-get > /dev/null 2>&1
    IS_PKG=$?
    IS_PKG=`echo "${IS_PKG}" | sed 's/ //g' | sed 's/\t//g' | tr -d '\n'`
    if [ "${IS_PKG}" = "0" ]; then
      apt-get install -y libx11-dev libgl1-mesa-dev libxext-dev perl perl-modules make gcc
    fi
  elif [ "$(expr substr $(uname -s) 1 9)" == 'CYGWIN_NT' ]; then
    echo "OS: Cygwin"
    #Cygwinの場合、必要なインストールパッケージがあればここにapt-cygなどインストールコマンドを記載する。
  fi

  curl -k -L -O https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/byte-unixbench/UnixBench5.1.3.tgz

  tar xvzf UnixBench5.1.3.tgz
  rm -f UnixBench5.1.3.tgz

  #macOSの場合はパッチを適用する。
  if [ "$(uname)" == 'Darwin' ]; then
    cd ${UNIX_BENCH_DIR}/UnixBench/
    curl -k -L -O https://gist.github.com/barusan/11033924/archive/a4f8041dd651ba14b03710b383b9b8a194c323fb.zip
    unzip a4f8041dd651ba14b03710b383b9b8a194c323fb.zip
    patch -p1 < ./a4f8041dd651ba14b03710b383b9b8a194c323fb/UnixBench5.1.3.mavericks.patch
    make
    rm -rf a4f8041dd651ba14b03710b383b9b8a194c323fb.zip
  fi
fi

cd ${UNIX_BENCH_DIR}/UnixBench/
chmod 755 ./Run
chmod 755 ./kill_run

#全てのベンチマークを実行する場合
#./Run

#簡易テストとしてCPUのPipe Throughputのみを5回実行
./Run -i 5 pipe

Linux、macOSなどのUnix環境でCPUベンチマークツール「UnixBench」をインストールするシェルスクリプト(バッチ処理プログラム)の実行例

「./Run -i 5 pipe」の実行では数分程度の短時間でCPU性能が簡易測定でき、下記のように結果が表示されます。

[root@localhost ~]# chmod 755 unixbench_installer_and_run.sh
[root@localhost ~]# ./unixbench_installer_and_run.sh
   #    #  #    #  #  #    #          #####   ######  #    #   ####   #    #
   #    #  ##   #  #   #  #           #    #  #       ##   #  #    #  #    #
   #    #  # #  #  #    ##            #####   #####   # #  #  #       ######
   #    #  #  # #  #    ##            #    #  #       #  # #  #       #    #
   #    #  #   ##  #   #  #           #    #  #       #   ##  #    #  #    #
    ####   #    #  #  #    #          #####   ######  #    #   ####   #    #

   Version 5.1.3                      Based on the Byte Magazine Unix Benchmark

   Multi-CPU version                  Version 5 revisions by Ian Smith,
                                      Sunnyvale, CA, USA
   January 13, 2011                   johantheghost at yahoo period com


1 x Pipe Throughput  1 2 3 4 5

4 x Pipe Throughput  1 2 3 4 5

========================================================================
   BYTE UNIX Benchmarks (Version 5.1.3)

   System: webserver-gce: GNU/Linux
   OS: GNU/Linux -- 3.10.0-693.11.1.el7.x86_64 -- #1 SMP Mon Dec 4 23:52:40 UTC 2017
   Machine: x86_64 (x86_64)
   Language: en_US.utf8 (charmap="UTF-8", collate="UTF-8")
   CPU 0: Intel(R) Xeon(R) CPU @ 2.20GHz (4400.0 bogomips)
          Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET
   CPU 1: Intel(R) Xeon(R) CPU @ 2.20GHz (4400.0 bogomips)
          Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET
   CPU 2: Intel(R) Xeon(R) CPU @ 2.20GHz (4400.0 bogomips)
          Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET
   CPU 3: Intel(R) Xeon(R) CPU @ 2.20GHz (4400.0 bogomips)
          Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET
   10:11:58 up 14:40,  1 user,  load average: 0.68, 0.60, 0.37; runlevel 3

------------------------------------------------------------------------
Benchmark Run: 金 12月 08 2017 10:11:58 - 10:13:03
4 CPUs in system; running 1 parallel copy of tests

Pipe Throughput                             1923370.9 lps   (10.0 s, 4 samples)

System Benchmarks Partial Index              BASELINE       RESULT    INDEX
Pipe Throughput                               12440.0    1923370.9   1546.1
                                                                   ========
System Benchmarks Index Score (Partial Only)                         1546.1

------------------------------------------------------------------------
Benchmark Run: 金 12月 08 2017 10:13:03 - 10:14:09
4 CPUs in system; running 4 parallel copies of tests

Pipe Throughput                             6529801.6 lps   (10.0 s, 4 samples)

System Benchmarks Partial Index              BASELINE       RESULT    INDEX
Pipe Throughput                               12440.0    6529801.6   5249.0
                                                                   ========
System Benchmarks Index Score (Partial Only)                         5249.0

Reference: Tech Blog citing related sources