10月19日にMySQL5.7がGAになったので、新規追加されたJSONデータ型の確認を行いました。
JSONはXMLと同じように、スマートフォンアプリ用のAPIやB2BやB2C連携でJSON APIが多く使われているようです。

基本的な動作検証
1. 基本的な構文バリデーション機能
2. JSONデータ型とTEXT型のパフォーマンス差
3. JSONとGenerated Columnの連携によるインデックス利用とパフォーマンス
4. JSONドキュメントの部分アップデート

ちなみに、ザックリとGoogleで検索してみると以下のように多くのサイトがJSON用のAPIを提供していました。
Twitter
https://dev.twitter.com/rest/reference/get/statuses/user_timeline
原子力規制委員会
http://radioactivity.nsr.go.jp/data/ja/real/area_24000/2401_trend.json
Google API
https://storage.googleapis.com/maps-devrel/google.json
ぐるナビ
http://api.gnavi.co.jp/api/tools/?apitype=ver1_RestSearchAPI
シカゴ市
https://data.cityofchicago.org/resource/alternative-fuel-locations.json?$limit=100&$offset=50

1. 基本的な構文バリデーション機能

検証テーブル (TEXT型)

CREATE TABLE `employees_txt` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `data` text NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4

検証テーブル (JSON型)

CREATE TABLE `employees_json` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `data` json NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4

それぞれのテーブルに、構文ミスしたJSONデータを入れてみると以下のようになる。
JSONデータ型はINSERT時のバリデーションが正常に効いている。


root@localhost [NEW57]> INSERT INTO NEW57.employees_txt(data) VALUES ('{"id": 1, "name": "Jane"}');
Query OK, 1 row affected (0.00 sec)

root@localhost [NEW57]> INSERT INTO NEW57.employees_txt(data) VALUES ('{"id": 2, "name": "Joe"');
Query OK, 1 row affected (0.01 sec)

root@localhost [NEW57]> SELECT * FROM NEW57.employees_txt;
+----+---------------------------+
| id | data                      |
+----+---------------------------+
|  1 | {"id": 1, "name": "Jane"} |
|  2 | {"id": 2, "name": "Joe"   |
+----+---------------------------+
2 rows in set (0.00 sec)

root@localhost [NEW57]> INSERT INTO NEW57.employees_json(data) VALUES ('{"id": 1, "name": "Jane"}');
Query OK, 1 row affected (0.01 sec)

root@localhost [NEW57]> INSERT INTO NEW57.employees_json(data) VALUES ('{"id": 2, "name": "Joe"');
ERROR 3140 (22032): Invalid JSON text: "Missing a comma or '}' after an object member." at position 23 in value (or column) '{"id": 2, "name": "Joe"'.
root@localhost [NEW57]> SELECT * FROM NEW57.employees_json;
+----+---------------------------+
| id | data                      |
+----+---------------------------+
|  1 | {"id": 1, "name": "Jane"} |
+----+---------------------------+
1 row in set (0.00 sec)

root@localhost [NEW57]> 

2. JSONデータ型とTEXT型のパフォーマンス差
セミナーでも実施しましたが、以下のようなシンプルなテーブルに対して、
ダウンロードしてきた、20万6千件のJSONデータをインサートして参照レスポンス比較。

それぞれの参照クエリにて同じコマンドと同じデータでレスポンス比較
SELECT distinct json_extract(feature,’$.type’) as feature FROM NEW57.features_txt;
SELECT distinct json_extract(feature,’$.type’) as feature FROM NEW57.features_json;

結果としては、JSON型の方がTEXT型に比べて圧倒的に早い事が確認出来る。

[root@misc01 SOD2015]# ./json_and_text_without_index.sh 
INDEXの無いテーブルに対するSELECTを、TEXT型とJSONデータ型で比較します。
SELECT distinct json_extract(feature,'$.type') as feature FROM 各テーブル

【TEXT型】
mysql: [Warning] Using a password on the command line interface can be insecure.
+-----------+
| feature   |
+-----------+
| "Feature" |
+-----------+

real    0m9.724s
user    0m0.005s
sys     0m0.002s

【JSON型】
mysql: [Warning] Using a password on the command line interface can be insecure.
+-----------+
| feature   |
+-----------+
| "Feature" |
+-----------+

real    0m1.506s
user    0m0.004s
sys     0m0.004s
[root@misc01 SOD2015]# 

3. JSONとGenerated Columnの連携によるインデックス利用とパフォーマンス
JSONドキュメントのオブジェクトの中からSTREET名の部分からデータを抽出して列を作成しIndexを付与。

列:      json_extract(feature,’$.properties.STREET’))
インデックス: KEY `feature_street` (`feature_street`)

 

JSONデータ型のサンプルを入れたテーブル
mysql: [Warning] Using a password on the command line interface can be insecure.
*************************** 1. row ***************************
            id: 12250
       feature: {"type": "Feature", "geometry": {"type": "Polygon", "coordinates": [[[-122.39836263491878, 37.79189388899312, 0], [-122.39845248797837, 37.79233030084018, 0], [-122.39768507706792, 37.7924280850133, 0], [-122.39836263491878, 37.79189388899312, 0]]]}, "properties": {"TO_ST": "388", "BLKLOT": "0265003", "STREET": "MARKET", "FROM_ST": "388", "LOT_NUM": "003", "ST_TYPE": "ST", "ODD_EVEN": "E", "BLOCK_NUM": "0265", "MAPBLKLOT": "0265003"}}
  feature_type: "Feature"
feature_street: "MARKET"
Press [Enter] key to resume.

JSONデータ型とGenerated Columnを利用したテーブル
mysql: [Warning] Using a password on the command line interface can be insecure.
*************************** 1. row ***************************
       Table: features
Create Table: CREATE TABLE `features` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `feature` json NOT NULL,
  `feature_type` varchar(30) GENERATED ALWAYS AS (json_extract(feature,'$.type')) VIRTUAL,
  `feature_street` varchar(30) GENERATED ALWAYS AS (json_extract(feature,'$.properties.STREET')) VIRTUAL,
  PRIMARY KEY (`id`),
  KEY `feature_type` (`feature_type`),
  KEY `feature_street` (`feature_street`)
) ENGINE=InnoDB AUTO_INCREMENT=206561 DEFAULT CHARSET=utf8mb4
Press [Enter] key to resume.

JSONドキュメントに対して、INDEX検索が利用出来るか確認 -> where json_extract(feature,'$.properties.STREET') = '"MARKET"'
mysql: [Warning] Using a password on the command line interface can be insecure.
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: features
   partitions: NULL
         type: ref
possible_keys: feature_street
          key: feature_street
      key_len: 123
          ref: const
         rows: 808
     filtered: 100.00
        Extra: NULL
[root@misc01 SOD2015]# 

4. JSONドキュメントの部分アップデート
JSONドキュメントの一部をUPDATEする場合の処理方法確認。
TEXT型だと、全ての列データを入れ替える必要がありますが、JSONだと一部のみ変更可能です。

select id,body,json_extract(body,"$.price") as extract from T_JSON_DOC where id = 3;
+----+------------------------------------------------------------------------+---------+
| id | body                                                                   | extract |
+----+------------------------------------------------------------------------+---------+
|  3 | {"id": 3, "name": "冷蔵庫", "price": 50000, "Conditions": ["NEW", 2015]}| 50000   |
+----+------------------------------------------------------------------------+---------+

update T_JSON_DOC set T_JSON_DOC.body = JSON_REPLACE(body,"$.price",15000) 
where id = 3;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

select id,body,json_extract(body,"$.price") as extract from T_JSON_DOC where id = 3;
+----+----------------------------------------------------------------------- +---------+
| id | body                                                                   | extract |
+----+------------------------------------------------------------------------+---------+
|  3 | {"id": 3, "name": "冷蔵庫", "price": 15000, "Conditions": ["NEW", 2015]}| 15000   |
+----+------------------------------------------------------------------------+---------+

文字入れ替えに便利なJSONファンクション(例)
JSON_SET() 既存の値を置き換え、存在しない値を追加
JSON_INSERT() 既存の値を置き換えずに値を挿入
JSON_REPLACE() 既存の値のみを置き換えます

参照:
11.6 The JSON Data Type
https://dev.mysql.com/doc/refman/5.7/en/json.html

MySQL5.7セミナー資料
https://www-jp.mysql.com/news-and-events/seminar/downloads.html


■ Windwosのパフォーマンスモニタで確認する項目

・SQLSERVERで使用しているドライブの下記の項目
\PhysicalDisk()\Avg. Disk Queue Length
\PhysicalDisk()\Disk Reads/sec
\PhysicalDisk()\Disk Writes/sec

・CPU
\Processor(_Total)\% Processor Time

・SQLのキャッシュヒット率
\SQLServer:Buffer Manager\Buffer cache hit ratio

SQL Statistics
・Batch Requests/sec
  →秒間のコマンド数(問合せのクエリ以外のコマンドもカウントされるので、
   実際のクエリ発行数ではありませんが、利用状況を把握できます)

Buffer Manager
 ・Page life expectancy
  →DB上にデータを保持している時間 300秒を下回っているとメモリが足りていない可能性

Locks
 ・Lock Requests/sec
 ・Lock Waits/sec
  →ロック待ち

Access Methods
 ・Index Searches/sec
 ・Probe Scans/sec
 ・Range Scans/sec
 ・Full Scans/sec
  →Full Scan(テーブルスキャン)が多いと適切なインデックスが無い可能性

■ディスクのパフォーマンス測定ツールとして
 CrystalDiskMark
 可能であれば、ファイルサイズ 1000MBで
 どれくらいのパフォーマンスが出るストレージか確認。

その他参考サイト
http://msdn.microsoft.com/ja-jp/magazine/cc135978.aspx

・不足インデックスのコスト
・I/O に関してコストのかかるクエリ
・CPU に関してコストのかかるクエリ

その他、DBのオブジェクト確認用スクリプト

select
SU.NAME,
(SELECT
 CASE SP.action
          WHEN '26' THEN 'REFERENCES'
          WHEN '178' THEN 'CREATE FUNCTION'
          WHEN '193' THEN 'SELECT'
          WHEN '195' THEN 'INSERT'
          WHEN '196' THEN 'DELETE'
          WHEN '197' THEN 'UPDATE'
          WHEN '198' THEN 'CREATE TABLE'
          WHEN '203' THEN 'CREATE DATABASE'
          WHEN '207' THEN 'CREATE VIEW'
          WHEN '222' THEN 'CREATE PROCEDURE'
          WHEN '224' THEN 'EXECUTE'
          WHEN '228' THEN 'BACKUP DATABASE'
          WHEN '233' THEN 'CREATE DEFAULT'
          WHEN '235' THEN 'BACKUP LOG'
          WHEN '236' THEN 'CREATE RULE'
          ELSE '判別不能'
   END )AS '権限',
SO.NAME,
(select
CASE SO.XTYPE
  WHEN 'U' THEN 'テーブル'
  WHEN 'P' THEN 'ストアドプロシジャー'
  ELSE 'それ以外'
  END ) AS '種類',
SO.CRDATE
from sysusers SU,sysprotects SP, sysobjects SO
where SU.UID = SP.UID AND SO.ID = SP.ID AND SO.XTYPE IN('U','P')
order by SU.NAME,SO.CRDATE desc
--order by SO.CRDATE desc,SU.NAME

MYSQL5.6がリリースされてから2週間経過して色々と検証してくださる方がいて、
MYSQL5.6からはPerformance_SchemaがDefaultになっているので少しオーバーヘッドが高いのでは?
などVariableの値が増えているなど色々と出てきました。

Review of MySQL 5.6 Defaults Changes
MySQL 5.5 and 5.6 default variable values differences
Is MySQL 5.6 slower than MySQL 5.5 ?
Performance Schema overhead
MySQL5.6で増えたexplicit_defaults_for_timestamp

Performance検証は今後時間をとって行いますが、先ずはVariableの変更部分だけ調べてみました。

variableの値は”331 rows in set”が返ってくる。

mysql> select @@hostname;
+---------------------+
| @@hostname          |
+---------------------+
| HOME001.localdomain |
+---------------------+
1 row in set (0.00 sec)

mysql> select @@version;
+------------+
| @@version  |
+------------+
| 5.5.29-log |
+------------+
1 row in set (0.00 sec)
mysql>

[root@HOME001 ~]# mysql -u root -e "show variables" -p |  awk '{ print $1}' > /home/mysql/5.5.29.txt
Enter password:
[root@HOME001 ~]#

variableの値は”435 rows in set”が返ってくる。

mysql> select @@hostname;
+---------------------+
| @@hostname          |
+---------------------+
| HOME002.localdomain |
+---------------------+
1 row in set (0.00 sec)

mysql> select @@version;
+------------+
| @@version  |
+------------+
| 5.6.10-log |
+------------+
1 row in set (0.00 sec)

mysql>

[root@HOME002 ~]# mysql -u root -e "show variables" -p |  awk '{ print $1}' > 5.6.10.txt
Enter password:
[root@HOME002 ~]#

上記で取得した値をdiffコマンドで、増加・変更のあった値を調査してみる。

[root@HOME002 mysql]# diff -y -y --suppress-common-lines 5.5.29.txt 5.6.10.txt
                                                              > bind_address
                                                              > binlog_checksum
                                                              > binlog_max_flush_queue_time
                                                              > binlog_order_commits
                                                              > binlog_row_image
                                                              > binlog_rows_query_log_events
                                                              > core_file
                                                              > default_tmp_storage_engine
                                                              > disconnect_on_expired_password
engine_condition_pushdown                                     | end_markers_in_json
                                                              > enforce_gtid_consistency
                                                              > eq_range_index_dive_limit
                                                              > explicit_defaults_for_timestamp
                                                              > gtid_executed
                                                              > gtid_mode
                                                              > gtid_next
                                                              > gtid_owned
                                                              > gtid_purged
have_csv                                                      <
have_innodb                                                   <
have_ndbcluster                                               <
have_partitioning                                             <
                                                              > host_cache_size
                                                              > ignore_db_dirs
                                                              > innodb_adaptive_flushing_lwm
                                                              > innodb_api_bk_commit_interval
                                                              > innodb_api_disable_rowlock
                                                              > innodb_api_enable_binlog
                                                              > innodb_api_enable_mdl
                                                              > innodb_api_trx_level
                                                              > innodb_buffer_pool_dump_at_shutdown
                                                              > innodb_buffer_pool_dump_now
                                                              > innodb_buffer_pool_filename
                                                              > innodb_buffer_pool_load_abort
                                                              > innodb_buffer_pool_load_at_startup
                                                              > innodb_buffer_pool_load_now
                                                              > innodb_change_buffer_max_size
                                                              > innodb_checksum_algorithm
                                                              > innodb_cmp_per_index_enabled
                                                              > innodb_compression_failure_threshold_pct
                                                              > innodb_compression_level
                                                              > innodb_compression_pad_pct_max
                                                              > innodb_disable_sort_file_cache
                                                              > innodb_flush_log_at_timeout
                                                              > innodb_flush_neighbors
                                                              > innodb_flushing_avg_loops
                                                              > innodb_ft_aux_table
                                                              > innodb_ft_cache_size
                                                              > innodb_ft_enable_diag_print
                                                              > innodb_ft_enable_stopword
                                                              > innodb_ft_max_token_size
                                                              > innodb_ft_min_token_size
                                                              > innodb_ft_num_word_optimize
                                                              > innodb_ft_server_stopword_table
                                                              > innodb_ft_sort_pll_degree
                                                              > innodb_ft_user_stopword_table
                                                              > innodb_io_capacity_max
                                                              > innodb_lru_scan_depth
                                                              > innodb_max_dirty_pages_pct_lwm
                                                              > innodb_max_purge_lag_delay
                                                              > innodb_monitor_disable
                                                              > innodb_monitor_enable
                                                              > innodb_monitor_reset
                                                              > innodb_monitor_reset_all
                                                              > innodb_online_alter_log_max_size
                                                              > innodb_optimize_fulltext_only
                                                              > innodb_page_size
                                                              > innodb_print_all_deadlocks
                                                              > innodb_read_only
                                                              > innodb_sort_buffer_size
                                                              > innodb_stats_auto_recalc
                                                              > innodb_stats_persistent
                                                              > innodb_stats_persistent_sample_pages
                                                              > innodb_stats_transient_sample_pages
                                                              > innodb_sync_array_size
                                                              > innodb_undo_directory
                                                              > innodb_undo_logs
                                                              > innodb_undo_tablespaces
log                                                           <
                                                              > log_bin_basename
                                                              > log_bin_index
                                                              > log_bin_use_v1_row_events
log_slow_queries                                              | log_throttle_queries_not_using_indexes
                                                              > master_info_repository
                                                              > master_verify_checksum
max_long_data_size                                            <
                                                              > metadata_locks_hash_instances
                                                              > optimizer_trace
                                                              > optimizer_trace_features
                                                              > optimizer_trace_limit
                                                              > optimizer_trace_max_mem_size
                                                              > optimizer_trace_offset
                                                              > performance_schema_accounts_size
                                                              > performance_schema_digests_size
                                                              > performance_schema_events_stages_history_long_size
                                                              > performance_schema_events_stages_history_size
                                                              > performance_schema_events_statements_history_long_size
                                                              > performance_schema_events_statements_history_size
                                                              > performance_schema_hosts_size
                                                              > performance_schema_max_socket_classes
                                                              > performance_schema_max_socket_instances
                                                              > performance_schema_max_stage_classes
                                                              > performance_schema_max_statement_classes
                                                              > performance_schema_session_connect_attrs_size
                                                              > performance_schema_setup_actors_size
                                                              > performance_schema_setup_objects_size
                                                              > performance_schema_users_size
                                                              > pseudo_slave_mode
                                                              > relay_log_basename
                                                              > relay_log_info_repository
rpl_recovery_rank                                             | rpl_semi_sync_slave_enabled
rpl_semi_sync_master_enabled                                  | rpl_semi_sync_slave_trace_level
rpl_semi_sync_master_timeout                                  <
rpl_semi_sync_master_trace_level                              <
rpl_semi_sync_master_wait_no_slave                            <
                                                              > server_id_bits
                                                              > server_uuid
                                                              > slave_allow_batching
                                                              > slave_checkpoint_group
                                                              > slave_checkpoint_period
                                                              > slave_parallel_workers
                                                              > slave_pending_jobs_size_max
                                                              > slave_rows_search_algorithms
                                                              > slave_sql_verify_checksum
sql_big_tables                                                <
sql_low_priority_updates                                      <
sql_max_join_size                                             <
                                                              > ssl_crl
                                                              > ssl_crlpath
                                                              > table_open_cache_instances
                                                              > transaction_allow_batching
                                                              > tx_read_only
[root@HOME002 mysql]#

variables


show status

どれだけのデータが変更されているか把握する事で、
データベースをどのように調整したら良いかある程度デザインする上での指標になるかと思います。

データ追加頻度

mysql> show status like '%insert%';
+------------------------+-------+
| Variable_name          | Value |
+------------------------+-------+
| Com_insert             | 1     |INSERTコマンド実行数:再接続すると0にリセットされます
| Com_insert_select      | 0     |
| Delayed_insert_threads | 0     |
| Innodb_rows_inserted   | 1     |起動からのInnoDB Row Insert累計件数
| Qcache_inserts         | 0     |
+------------------------+-------+
5 rows in set (0.00 sec)

mysql> insert into TABLE001(title,comment) values('confirmation','Innodb_rows_inserted time 2');
Query OK, 1 row affected (0.42 sec)

mysql> show status like '%insert%';
+------------------------+-------+
| Variable_name          | Value |
+------------------------+-------+
| Com_insert             | 2     |
| Com_insert_select      | 0     |
| Delayed_insert_threads | 0     |
| Innodb_rows_inserted   | 2     |
| Qcache_inserts         | 0     |
+------------------------+-------+
5 rows in set (0.00 sec)

mysql>

insert

更新頻度

mysql> show status like '%update%';
+---------------------+-------+
| Variable_name       | Value |
+---------------------+-------+
| Com_update          | 0     | UPDATEコマンド実行数:再接続すると0にリセットされます
| Com_update_multi    | 0     |
| Handler_update      | 0     | Update Row数:再接続すると0にリセットされます
| Innodb_rows_updated | 0     | 起動からのInnoDB Row Update累計件数
+---------------------+-------+
4 rows in set (0.00 sec)

mysql> select * from TABLE001 where id = 39;
+----+--------------+----------------------+
| id | title        | comment              |
+----+--------------+----------------------+
| 39 | confirmation | Com_update increment |
+----+--------------+----------------------+
1 row in set (0.00 sec)

mysql> update TABLE001 set comment = 'Innodb_rows_updated test1' where id = 39;
Query OK, 1 row affected (0.49 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> show status like '%update%';
+---------------------+-------+
| Variable_name       | Value |
+---------------------+-------+
| Com_update          | 1     |
| Com_update_multi    | 0     |
| Handler_update      | 1     |
| Innodb_rows_updated | 1     |
+---------------------+-------+
4 rows in set (0.00 sec)

mysql> 

update

削除頻度

mysql> show status like '%delete%';
+---------------------+-------+
| Variable_name       | Value |
+---------------------+-------+
| Com_delete          | 0     |
| Com_delete_multi    | 0     |
| Handler_delete      | 0     |
| Innodb_rows_deleted | 0     |
+---------------------+-------+
4 rows in set (0.00 sec)

mysql>  delete from TABLE001 where id > 40;
Query OK, 5 rows affected (0.44 sec)

mysql> show status like '%delete%';
+---------------------+-------+
| Variable_name       | Value |
+---------------------+-------+
| Com_delete          | 1     | DELETEコマンド実行数:再接続すると0にリセットされます
| Com_delete_multi    | 0     | 
| Handler_delete      | 5     | DELETE Row数:再接続すると0にリセットされます
| Innodb_rows_deleted | 5     | 起動からのInnoDB Row Delete累計件数
+---------------------+-------+
4 rows in set (0.00 sec)

mysql>

delete

並列状態

mysql> show status like '%threads%';
+------------------------+-------+
| Variable_name          | Value |
+------------------------+-------+
| Delayed_insert_threads | 0     |
| Slow_launch_threads    | 0     |
| Threads_cached         | 0     |
| Threads_connected      | 2     | 取得した瞬間の値
| Threads_created        | 5     | 起動から作成されたスレッド数累計
| Threads_running        | 2     | 取得した瞬間の値
+------------------------+-------+
6 rows in set (0.00 sec)

mysql>

mysql> show processlist;
+----+------------+--------------+------+-------------+------+-----------------------------------------------------------------------+------------------+
| Id | User       | Host         | db   | Command     | Time | State                                                                 | Info             |
+----+------------+--------------+------+-------------+------+-----------------------------------------------------------------------+------------------+
|  3 | slave_user | home002:4367 | NULL | Binlog Dump | 5203 | Master has sent all binlog to slave; waiting for binlog to be updated | NULL             |
|  5 | root       | localhost    | test | Query       |    0 | NULL                                                                  | show processlist |
+----+------------+--------------+------+-------------+------+-----------------------------------------------------------------------+------------------+
2 rows in set (0.00 sec)

mysql>



ディスクとメモリーへの書き込み速度確認
ddコマンドで128Mのブロックサイズを2回書き込んだ速度確認

ディスク: real 0m7.087s
メモリー: real 0m0.788s
約9倍の書き込み速度の違いが見られる。

ファイルシステムへの書き込み速度

[root@HOME001 local]# df -h
Filesystem            Size  Used Avail Use% マウント位置
/dev/mapper/vg_home001-lv_root
                       47G  2.5G   42G   6% /
tmpfs                 947M     0  947M   0% /dev/shm
/dev/sda1             485M   36M  424M   8% /boot
/dev/mapper/vg_home001-lv_home
                      4.6G  322M  4.0G   8% /home
[root@HOME001 local]# time dd if=/dev/zero of=/usr/local/tmp/tmpfs bs=128M count=2
2+0 records in
2+0 records out
268435456 bytes (268 MB) copied, 7.06478 s, 38.0 MB/s

real    0m7.087s
user    0m0.001s
sys     0m0.949s
[root@HOME001 local]# rm -f /usr/local/tmp/*

[root@HOME001 local]# free
             total       used       free     shared    buffers     cached
Mem:       1938948     200436    1738512          0      10720      94452
-/+ buffers/cache:      95264    1843684
Swap:      4161528          0    4161528
[root@HOME001 local]#

tmpfs(メモリー)への書き込み速度

[root@HOME001 local]# mount -t tmpfs -o size=512m tmpfs /usr/local/tmp
[root@HOME001 local]# df -h
Filesystem            Size  Used Avail Use% マウント位置
/dev/mapper/vg_home001-lv_root
                       47G  2.5G   42G   6% /
tmpfs                 947M     0  947M   0% /dev/shm
/dev/sda1             485M   36M  424M   8% /boot
/dev/mapper/vg_home001-lv_home
                      4.6G  322M  4.0G   8% /home
tmpfs                 512M     0  512M   0% /usr/local/tmp
[root@HOME001 local]# time dd if=/dev/zero of=/usr/local/tmp/tmpfs bs=128M count=2
2+0 records in
2+0 records out
268435456 bytes (268 MB) copied, 0.770854 s, 348 MB/s

real    0m0.788s
user    0m0.000s
sys     0m0.784s
[root@HOME001 local]#

[root@HOME001 local]# df -h
Filesystem            Size  Used Avail Use% マウント位置
/dev/mapper/vg_home001-lv_root
                       47G  2.5G   42G   6% /
tmpfs                 947M     0  947M   0% /dev/shm
/dev/sda1             485M   36M  424M   8% /boot
/dev/mapper/vg_home001-lv_home
                      4.6G  322M  4.0G   8% /home
tmpfs                 512M  257M  256M  51% /usr/local/tmp
[root@HOME001 local]# free
             total       used       free     shared    buffers     cached
Mem:       1938948     462820    1476128          0      10720     356596
-/+ buffers/cache:      95504    1843444
Swap:      4161528          0    4161528
[root@HOME001 local]#

tempfs

fstabに追記して常時起動

[root@HOME001 local]# df -h
Filesystem            Size  Used Avail Use% マウント位置
/dev/mapper/vg_home001-lv_root     47G  2.5G   42G   6% /
tmpfs                             947M     0  947M   0% /dev/shm
/dev/sda1                         485M   36M  424M   8% /boot
/dev/mapper/vg_home001-lv_home    4.6G  322M  4.0G   8% /home
[root@HOME001 local]# vi /etc/fstab

[root@HOME001 local]# cat /etc/fstab
#
# /etc/fstab
# Created by anaconda on Sun Nov 25 06:08:34 2012
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/vg_home001-lv_root /                       ext4    defaults        1 1
UUID=d0a823c7-d51e-42de-b422-2f3ab5d82d96 /boot                   ext4    defaults        1 2
/dev/mapper/vg_home001-lv_home /home                   ext4    defaults        1 2
/dev/mapper/vg_home001-lv_swap swap                    swap    defaults        0 0
tmpfs                   /dev/shm                tmpfs   defaults        0 0
devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
sysfs                   /sys                    sysfs   defaults        0 0
proc                    /proc                   proc    defaults        0 0
# add for memory disk
tmpfs                   /usr/local/tmp          tmpfs   defaults,size=512m 0 0
[root@HOME001 local]#


[root@HOME001 local]# mount -a
[root@HOME001 local]# df -h
Filesystem            Size  Used Avail Use% マウント位置
/dev/mapper/vg_home001-lv_root     47G  2.5G   42G   6% /
tmpfs                             947M     0  947M   0% /dev/shm
/dev/sda1                         485M   36M  424M   8% /boot
/dev/mapper/vg_home001-lv_home    4.6G  322M  4.0G   8% /home
tmpfs                             128M     0  512M   0% /usr/local/tmp
[root@HOME001 local]#


[root@HOME001 local]# time dd if=/dev/zero of=/usr/local/tmp/tmpfs bs=128M count=2
2+0 records in
2+0 records out
268435456 bytes (268 MB) copied, 0.776067 s, 346 MB/s

real    0m0.793s
user    0m0.001s
sys     0m0.789s
[root@HOME001 local]#

再起動後もマウントされている事を確認済み

fstab

関連スレ
MYSQL with tempfs


Linuxシステムにてディスクボトルネックを確認する為のコマンド

VMSTAT

[root@HOME001 ~]# vmstat
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 0  0      0 1663492  10488 167444    0    0    62    19   31   58  1  0 97  2  0
[root@HOME001 ~]#

IOSTAT

[root@HOME001 ~]# iostat
Linux 2.6.32-279.el6.i686 (HOME001.localdomain)         2012年12月29日  _i686_  (1 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.66    0.00    0.54    1.83    0.00   96.98

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
sda               2.70       142.88        44.06     284638      87784
dm-0              7.92       129.00        44.04     256994      87728
dm-1              0.16         1.29         0.00       2576          0
dm-2              0.06         0.46         0.01        922         24

[root@HOME001 ~]# 

[root@HOME001 iotop-0.4.4]# iostat -d -x
Linux 2.6.32-279.el6.i686 (HOME001.localdomain)         2012年12月29日  _i686_  (1 CPU)

Device:         rrqm/s   wrqm/s     r/s     w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await  svctm  %util
sda               0.67     3.11    1.39    0.39    88.43    27.72    65.42     0.21  115.80  11.72   2.08
dm-0              0.00     0.00    1.57    3.42    80.07    27.33    21.51     1.78  356.10   3.90   1.95
dm-1              0.00     0.00    0.10    0.00     0.77     0.00     8.00     0.00    5.24   2.16   0.02
dm-2              0.00     0.00    0.05    0.05     0.37     0.38     7.93     0.00   16.82  12.62   0.12

[root@HOME001 iotop-0.4.4]#

[root@HOME001 iotop-0.4.4]# iostat -d -x dm-0 15 10
Linux 2.6.32-279.el6.i686 (HOME001.localdomain)         2012年12月29日  _i686_  (1 CPU)

Device:         rrqm/s   wrqm/s     r/s     w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await  svctm  %util
dm-0              0.00     0.00    1.53    3.32    77.73    26.54    21.51     1.73  356.00   3.92   1.90

Device:         rrqm/s   wrqm/s     r/s     w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await  svctm  %util
dm-0              0.00     0.00    0.00    0.20     0.00     1.60     8.00     0.02  112.33 112.33   2.25

Device:         rrqm/s   wrqm/s     r/s     w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await  svctm  %util
dm-0              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00

iostat

iostat-part

Iotop
http://guichaz.free.fr/iotop/

Linux has always been able to show how much I/O was going on (the bi and bo columns of the vmstat 1 command).
Iotop is a Python program with a top like UI used to show of behalf of which process is the I/O going on.
It requires Python ≥ 2.5 (or Python ≥ 2.4 with the ctypes module) and a Linux kernel ≥ 2.6.20 with the
TASK_DELAY_ACCT CONFIG_TASKSTATS, TASK_IO_ACCOUNTING and CONFIG_VM_EVENT_COUNTERS options on.

必要なカーネルとPythonのバージョン確認

[root@HOME001 tools]# uname -r
2.6.32-279.el6.i686
[root@HOME001 tools]# python -V
Python 2.6.6
[root@HOME001 tools]#

uname_python

ダウンロードとインストール

[root@HOME001 tools]# wget http://guichaz.free.fr/iotop/files/iotop-0.4.4.tar.gz
--2012-12-29 07:12:15--  http://guichaz.free.fr/iotop/files/iotop-0.4.4.tar.gz
guichaz.free.fr をDNSに問いあわせています... 212.27.63.130
guichaz.free.fr|212.27.63.130|:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 30334 (30K) [application/x-gzip]
`iotop-0.4.4.tar.gz' に保存中

100%[=============================================================================>] 30,334      21.8K/s 時間 1.4s

2012-12-29 07:12:17 (21.8 KB/s) - `iotop-0.4.4.tar.gz' へ保存完了 [30334/30334]

[root@HOME001 tools]# tar zxvf iotop-0.4.4.tar.gz
iotop-0.4.4/
iotop-0.4.4/COPYING
iotop-0.4.4/PKG-INFO
iotop-0.4.4/NEWS
iotop-0.4.4/iotop/
iotop-0.4.4/iotop/__init__.py
iotop-0.4.4/iotop/netlink.py
iotop-0.4.4/iotop/ioprio.py
iotop-0.4.4/iotop/version.py
iotop-0.4.4/iotop/data.py
iotop-0.4.4/iotop/ui.py
iotop-0.4.4/iotop/genetlink.py
iotop-0.4.4/iotop/vmstat.py
iotop-0.4.4/.gitignore
iotop-0.4.4/iotop.py
iotop-0.4.4/ChangeLog
iotop-0.4.4/setup.py
iotop-0.4.4/README
iotop-0.4.4/iotop.1
iotop-0.4.4/setup.cfg
iotop-0.4.4/THANKS
iotop-0.4.4/bin/
iotop-0.4.4/bin/iotop
[root@HOME001 tools]#

[root@HOME001 iotop-0.4.4]# ./setup.py install
running install
running build
running build_py

install

iotopの実行

[root@HOME001 iotop-0.4.4]# /usr/bin/iotop
Total DISK READ:       0.00 B/s | Total DISK WRITE:       0.00 B/s
  TID  PRIO  USER     DISK READ  DISK WRITE  SWAPIN     IO>    COMMAND
    1 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % init
    2 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [kthreadd]
    3 rt/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [migration/0]
    4 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [ksoftirqd/0]
    5 rt/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [migration/0]
    6 rt/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [watchdog/0]
    7 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [events/0]
    8 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [cgroup]
    9 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [khelper]
   10 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [netns]
[root@HOME001 iotop-0.4.4]#


[root@HOME001 iotop-0.4.4]# iotop -bto --iter=1
07:27:50 Total DISK READ:       0.00 B/s | Total DISK WRITE:       0.00 B/s
    TIME  TID  PRIO  USER     DISK READ  DISK WRITE  SWAPIN      IO    COMMAND
[root@HOME001 iotop-0.4.4]#

iotop

iotop_optopm

以下パッケージでも入手可能との事
sudo aptitude install iotop
sudo yum install iotop
sudo emerge iotop
sudo pacman -Sy iotop

参考
http://guichaz.free.fr/iotop/

Using iotop to check I/O and swap

htopでパフォーマンス確認


MYSQLにもMSSQLやOracleのようにProfilerが無いか以前にも検証したのですが、
暫く現場を離れていて忘れていたのでセルフリマインドの為に再確認です。
MYSQL Profiling

Queryの実行プランは、その他DBと同じく実行プランの確認とインデックスの有無で対応可能ですが、
サーバーパラメーターのチューニングにPROFILEを利用してどのDB処理が遅いが確認する事が出来ます。
必要に応じてmy.cnfや動的パラメーターを変更しましょう。

Oracle (例)
EXPLAIN PLAN FOR select * from テーブル名;

MYSQL (例)
EXPLAIN select * from テーブル名;

mysql> explain select * from orders where o_id = 100;
+----+-------------+--------+------+---------------+------+---------+------+-------+-------------+
| id | select_type | table  | type | possible_keys | key  | key_len | ref  | rows  | Extra       |
+----+-------------+--------+------+---------------+------+---------+------+-------+-------------+
|  1 | SIMPLE      | orders | ALL  | NULL          | NULL | NULL    | NULL | 71933 | Using where |
+----+-------------+--------+------+---------------+------+---------+------+-------+-------------+
1 row in set (0.01 sec)

mysql>

PROFILEのONとOFFについて


mysql> SET profiling=1;
Query OK, 0 rows affected (0.00 sec)

mysql> SHOW VARIABLES LIKE 'profil%';
+------------------------+-------+
| Variable_name          | Value |
+------------------------+-------+
| profiling              | ON    |
| profiling_history_size | 15    |
+------------------------+-------+
2 rows in set (0.00 sec)

mysql> SET profiling=0;
Query OK, 0 rows affected (0.00 sec)

mysql> SHOW VARIABLES LIKE 'profil%';
+------------------------+-------+
| Variable_name          | Value |
+------------------------+-------+
| profiling              | OFF   |
| profiling_history_size | 15    |
+------------------------+-------+
2 rows in set (0.00 sec)

mysql>

mysql> show variables like 'profiling_history_size';
+------------------------+-------+
| Variable_name          | Value |
+------------------------+-------+
| profiling_history_size | 15    |
+------------------------+-------+
1 row in set (0.00 sec)

mysql>


実際に実行してみると、Source_functionとDurationでどの処理が、
どの位内部処理に時間がかかっているか確認出来る。

mysql> set profiling=1;
Query OK, 0 rows affected (0.00 sec)

[省略]

mysql> show databases;
+——————–+
| Database |
+——————–+
| information_schema |
| mysql |
| performance_schema |
| test |
| tpcc |
+——————–+
5 rows in set (0.00 sec)

mysql> show profiles;
+———-+————+——————-+
| Query_ID | Duration | Query |
+———-+————+——————-+
| 1 | 0.00636075 | show local status |
| 2 | 0.00027875 | set profiling=1 |
| 3 | 0.01078700 | show local status |
| 4 | 0.01107825 | show databases |
+———-+————+——————-+
4 rows in set (0.00 sec)

mysql> SHOW PROFILE SOURCE;
+——————–+———-+———————–+—————+————-+
| Status | Duration | Source_function | Source_file | Source_line |
+——————–+———-+———————–+—————+————-+
| starting | 0.001011 | NULL | NULL | NULL |
| Opening tables | 0.000583 | open_tables | sql_base.cc | 4838 |
| System lock | 0.000057 | mysql_lock_tables | lock.cc | 299 |
| init | 0.000062 | mysql_select | sql_select.cc | 2554 |
| optimizing | 0.000026 | optimize | sql_select.cc | 863 |
| statistics | 0.000055 | optimize | sql_select.cc | 1054 |
| preparing | 0.000041 | optimize | sql_select.cc | 1076 |
| executing | 0.003726 | exec | sql_select.cc | 1823 |
| Sending data | 0.000117 | exec | sql_select.cc | 2365 |
| end | 0.000026 | mysql_select | sql_select.cc | 2590 |
| query end | 0.000017 | mysql_execute_command | sql_parse.cc | 4439 |
| closing tables | 0.000007 | mysql_execute_command | sql_parse.cc | 4491 |
| removing tmp table | 0.000100 | free_tmp_table | sql_select.cc | 11180 |
| closing tables | 0.000015 | free_tmp_table | sql_select.cc | 11205 |
| freeing items | 0.004987 | mysql_parse | sql_parse.cc | 5639 |
| logging slow query | 0.000031 | log_slow_statement | sql_parse.cc | 1460 |
| cleaning up | 0.000218 | dispatch_command | sql_parse.cc | 1416 |
+——————–+———-+———————–+—————+————-+
17 rows in set (0.00 sec)

profile_mysql

Query_IDを指定して過去に実行したQuery詳細を確認

mysql> SHOW PROFILEs;
+———-+————+———————————————-+
| Query_ID | Duration | Query |
+———-+————+———————————————-+
| 1 | 0.00636075 | show local status |
| 2 | 0.00027875 | set profiling=1 |
| 3 | 0.01078700 | show local status |
| 4 | 0.01107825 | show databases |
| 5 | 0.00268775 | SHOW VARIABLES LIKE ‘tmp_table_size’ |
| 6 | 0.01079550 | show local status |
| 7 | 0.00259425 | show variables like ‘profiling_history_size’ |
+———-+————+———————————————-+
7 rows in set (0.00 sec)

mysql> SHOW PROFILE SOURCE FOR QUERY 7;
+——————–+———-+———————–+—————+————-+
| Status | Duration | Source_function | Source_file | Source_line |
+——————–+———-+———————–+—————+————-+
| starting | 0.000268 | NULL | NULL | NULL |
| Opening tables | 0.000510 | open_tables | sql_base.cc | 4838 |
| System lock | 0.000055 | mysql_lock_tables | lock.cc | 299 |
| init | 0.000050 | mysql_select | sql_select.cc | 2554 |
| optimizing | 0.000018 | optimize | sql_select.cc | 863 |
| statistics | 0.000028 | optimize | sql_select.cc | 1054 |
| preparing | 0.000023 | optimize | sql_select.cc | 1076 |
| executing | 0.001354 | exec | sql_select.cc | 1823 |
| Sending data | 0.000089 | exec | sql_select.cc | 2365 |
| end | 0.000016 | mysql_select | sql_select.cc | 2590 |
| query end | 0.000010 | mysql_execute_command | sql_parse.cc | 4439 |
| closing tables | 0.000005 | mysql_execute_command | sql_parse.cc | 4491 |
| removing tmp table | 0.000080 | free_tmp_table | sql_select.cc | 11180 |
| closing tables | 0.000014 | free_tmp_table | sql_select.cc | 11205 |
| freeing items | 0.000058 | mysql_parse | sql_parse.cc | 5639 |
| logging slow query | 0.000008 | log_slow_statement | sql_parse.cc | 1460 |
| cleaning up | 0.000010 | dispatch_command | sql_parse.cc | 1416 |
+——————–+———-+———————–+—————+————-+
17 rows in set (0.01 sec)

mysql>

specific query

その他のProfileオプション

mysql> SHOW PROFILE ALL;
mysql> SHOW PROFILE BLOCK IO;
mysql> SHOW PROFILE CONTEXT SWITCHES;
mysql> SHOW PROFILE CPU;
mysql> SHOW PROFILE IPC;
mysql> SHOW PROFILE MEMORY;
mysql> SHOW PROFILE PAGE FAULTS;

other option

最後にシンプルに特定クエリーだけ確認

mysql> SET profiling = 1;
Query OK, 0 rows affected (0.01 sec)

mysql> select * from T_Archive_Log where id = 100;
+-----+---------------------+------------------------------------------------------------------+------------+------------+-------------+
| id  | Sdd                 | Rdd                                                              | Error_Code | conf_time  |        flag |
+-----+---------------------+------------------------------------------------------------------+------------+------------+-------------+
| 100 | admin@variable.jp   | 59AA9E550C91F84FCD7777713258CBA9E56655E6089F2657838AFFE48BDCC6F9 | 550        | 2011-10-12 |           0 |
+-----+---------------------+------------------------------------------------------------------+------------+------------+-------------+
1 row in set (0.01 sec)

mysql> SHOW PROFILES;
+----------+------------+--------------------------------------------+
| Query_ID | Duration   | Query                                      |
+----------+------------+--------------------------------------------+
|        1 | 0.00117200 | select * from T_Archive_Log where id = 100 |
+----------+------------+--------------------------------------------+
1 row in set (0.00 sec)

mysql> SHOW PROFILE FOR QUERY 1;
+--------------------------------+----------+
| Status                         | Duration |
+--------------------------------+----------+
| starting                       | 0.000789 |
| Waiting for query cache lock   | 0.000005 |
| checking query cache for query | 0.000022 |
| checking permissions           | 0.000005 |
| Opening tables                 | 0.000016 |
| System lock                    | 0.000012 |
| Waiting for query cache lock   | 0.000005 |
| init                           | 0.000017 |
| optimizing                     | 0.000010 |
| statistics                     | 0.000071 |
| preparing                      | 0.000013 |
| executing                      | 0.000003 |
| Sending data                   | 0.000154 |
| end                            | 0.000012 |
| query end                      | 0.000004 |
| closing tables                 | 0.000009 |
| freeing items                  | 0.000016 |
| logging slow query             | 0.000004 |
| cleaning up                    | 0.000005 |
+--------------------------------+----------+
19 rows in set (0.02 sec)

mysql> SHOW PROFILE SOURCE FOR QUERY 1;
+--------------------------------+----------+-----------------------+---------------+-------------+
| Status                         | Duration | Source_function       | Source_file   | Source_line |
+--------------------------------+----------+-----------------------+---------------+-------------+
| starting                       | 0.000789 | NULL                  | NULL          |        NULL |
| Waiting for query cache lock   | 0.000005 | try_lock              | sql_cache.cc  |         454 |
| checking query cache for query | 0.000022 | send_result_to_client | sql_cache.cc  |        1561 |
| checking permissions           | 0.000005 | check_access          | sql_parse.cc  |        4745 |
| Opening tables                 | 0.000016 | open_tables           | sql_base.cc   |        4837 |
| System lock                    | 0.000012 | mysql_lock_tables     | lock.cc       |         299 |
| Waiting for query cache lock   | 0.000005 | try_lock              | sql_cache.cc  |         454 |
| init                           | 0.000017 | mysql_select          | sql_select.cc |        2554 |
| optimizing                     | 0.000010 | optimize              | sql_select.cc |         863 |
| statistics                     | 0.000071 | optimize              | sql_select.cc |        1054 |
| preparing                      | 0.000013 | optimize              | sql_select.cc |        1076 |
| executing                      | 0.000003 | exec                  | sql_select.cc |        1823 |
| Sending data                   | 0.000154 | exec                  | sql_select.cc |        2365 |
| end                            | 0.000012 | mysql_select          | sql_select.cc |        2590 |
| query end                      | 0.000004 | mysql_execute_command | sql_parse.cc  |        4434 |
| closing tables                 | 0.000009 | mysql_execute_command | sql_parse.cc  |        4486 |
| freeing items                  | 0.000016 | mysql_parse           | sql_parse.cc  |        5634 |
| logging slow query             | 0.000004 | log_slow_statement    | sql_parse.cc  |        1460 |
| cleaning up                    | 0.000005 | dispatch_command      | sql_parse.cc  |        1416 |
+--------------------------------+----------+-----------------------+---------------+-------------+
19 rows in set (0.00 sec)

mysql> SET profiling = 0;
Query OK, 0 rows affected (0.00 sec)

mysql>

参考サイト:
MYSQL Profiling
MySQLのEXPLAINを徹底解説!!
プロファイリングで快適MySQLチューニング生活


tpcc-mysqlを利用してのMYSQLベンチマーク

MS SQLのTPCCベンチマークをMS調布オフィスにて検証させて頂いた事があるが、
MYSQLにもTPCCベンチマークツールがあるのを聞いたので検証してみました。
※perconaが提供しているMYSQLのTPCCベンチマークツールです。

BZRが必要という事なのでインストール

[root@CentOS64VM ~]# yum install bzr
Loaded plugins: fastestmirror, presto
Loading mirror speeds from cached hostfile
 * base: www.ftp.ne.jp
 * extras: www.ftp.ne.jp
 * updates: www.ftp.ne.jp
Setting up Install Process
Resolving Dependencies
--> Running transaction check
---> Package bzr.x86_64 0:2.1.1-2.el6 will be installed
--> Processing Dependency: python-paramiko for package: bzr-2.1.1-2.el6.x86_64
--> Running transaction check
---> Package python-paramiko.noarch 0:1.7.5-2.1.el6 will be installed
--> Processing Dependency: python-crypto >= 1.9 for package: python-paramiko-1.7.5-2.1.el6.noarch
--> Running transaction check
---> Package python-crypto.x86_64 0:2.0.1-22.el6 will be installed
--> Finished Dependency Resolution


====================================================================================
Install       3 Package(s)

Total download size: 6.2 M
Installed size: 32 M
Is this ok [y/N]: y
Downloading Packages:
Setting up and reading Presto delta metadata
Processing delta metadata
Package(s) data still to download: 6.2 M
(1/3): bzr-2.1.1-2.el6.x86_64.rpm                | 5.3 MB     00:02
(2/3): python-crypto-2.0.1-22.el6.x86_64.rpm     | 159 kB     00:00
(3/3): python-paramiko-1.7.5-2.1.el6.noarch.rpm  | 728 kB     00:00
------------------------------------------------------------------------------------
====================================================================================

bazaarフォルダーを作成してtpcc-mysqlのソースをダウンロード

[root@CentOS64VM tools]# mkdir bazaar
[root@CentOS64VM tools]# ls -l
合計 59468
-r--r--r--. 1 root root 60883070  6月  9 10:59 2012 VMwareTools-8.8.4-743747.tar.gz
drwxr-xr-x. 2 root root     4096  7月 16 12:47 2012 bazaar
drwxr-xr-x. 7 root root     4096  6月  9 10:59 2012 vmware-tools-distrib
[root@CentOS64VM tools]#


[root@CentOS64VM bazaar]# bzr init
Created a standalone tree (format: 2a)
[root@CentOS64VM bazaar]# ls -la
合計 12
drwxr-xr-x. 3 root root 4096  7月 16 12:48 2012 .
drwxr-xr-x. 4 root root 4096  7月 16 12:47 2012 ..
drwxr-xr-x. 6 root root 4096  7月 16 12:48 2012 .bzr
[root@CentOS64VM bazaar]#

[root@CentOS64VM bazaar]# bzr branch lp:~percona-dev/perconatools/tpcc-mysql
You have not informed bzr of your Launchpad ID, and you must do this to
write to Launchpad or access private data.  See "bzr help launchpad-login".
Branched 42 revision(s).
[root@CentOS64VM bazaar]#


[root@CentOS64VM bazaar]# ls
tpcc-mysql
[root@CentOS64VM bazaar]# cd tpcc-mysql/
[root@CentOS64VM tpcc-mysql]# ls -l
合計 36
-rw-r--r--. 1 root root  749  7月 16 12:50 2012 README
-rw-r--r--. 1 root root 1621  7月 16 12:50 2012 add_fkey_idx.sql
-rw-r--r--. 1 root root  317  7月 16 12:50 2012 count.sql
-rw-r--r--. 1 root root 3105  7月 16 12:50 2012 create_table.sql
-rw-r--r--. 1 root root  763  7月 16 12:50 2012 drop_cons.sql
-rw-r--r--. 1 root root  477  7月 16 12:50 2012 load.sh
drwxr-xr-x. 2 root root 4096  7月 16 12:50 2012 schema2
drwxr-xr-x. 5 root root 4096  7月 16 12:50 2012 scripts
drwxr-xr-x. 2 root root 4096  7月 16 12:50 2012 src
[root@CentOS64VM tpcc-mysql]#

MYSQL関連ファイルのインストール
※バイナリー(Linux – Generic 2.6 (x86, 64-bit), Compressed TAR Archive)
を利用して予めMYSQLを設定したのですが、TPCCの検証でセグメントエラーが出てしまったので
MYSQLも検証の為だけに一度RPMからインストールしました。↓

【課題】
自分でMYSQLSERVER(コンパイル済みバイナリー)を設定して、
他のMYSQLパッケージをRPMでインストールした場合、実際に負荷をかけるtpcc_startの処理が失敗した。
エラーは、セグメンテーション違反(英語:segmentation fault)。
tpcc_loadの時は、Socket接続エラーが出たのでシンボリックリンクを作成して対応。
「ln -s /tmp/mysql.sock /var/lib/mysql/mysql.sock」
しかし、tpcc_startは失敗してしまったので、結局MYSQL ServerもRPMからインストールしたら問題無く処理された。
rpm -U --force MySQL-server-5.5.25a-1.linux2.6.x86_64.rpm
パスだけの問題?後日確認する。

[root@CentOS64VM tools]# ls -l MySQL-*
-rw-rw-r--. 1 root root 17644285  7月 16 13:54 2012 MySQL-client-5.5.25a-1.linux2.6.x86_64.rpm
-rw-rw-r--. 1 root root  6460556  7月 16 13:00 2012 MySQL-devel-5.5.25a-1.linux2.6.x86_64.rpm
-rw-rw-r--. 1 root root 67059427  7月 16 14:02 2012 MySQL-embedded-5.5.25a-1.linux2.6.x86_64.rpm
-rw-rw-r--. 1 root root 53387152  7月 16 16:37 2012 MySQL-server-5.5.25a-1.linux2.6.x86_64.rpm
-rw-rw-r--. 1 root root  2010686  7月 16 14:01 2012 MySQL-shared-5.5.25a-1.linux2.6.x86_64.rpm
-rw-rw-r--. 1 root root  5175183  7月 16 14:02 2012 MySQL-shared-compat-5.5.25a-1.linux2.6.x86_64.rpm
-rw-rw-r--. 1 root root 41228968  7月 16 14:02 2012 MySQL-test-5.5.25a-1.linux2.6.x86_64.rpm
[root@CentOS64VM tools]#

MYSQL関連のパッケージをインストールしたので、TPCC-MYSQLのコンパイル

———————————————————————————
README
———————————————————————————

[root@CentOS64VM tpcc-mysql]# cat README
1. Build binaries
   * cd scr ; make
   ( you should have mysql_config available in $PATH)

2. Load data
   * create database
     mysqladmin create tpcc1000
   * create tables
     mysql tpcc1000 < create_table.sql
   * create indexes and FK ( this step can be done after loading data)
     mysql tpcc1000 < add_fkey_idx.sql
   * populate data
     - simple step
       tpcc_load localhost tpcc1000 root "" 1000
                 |hostname| |dbname| |user| |password| |WAREHOUSES|
     - load data in parallel
       check load.sh script

3. start benchmark
   * tpcc_start localhost tpcc1000 root "" 1000 32 10 10800
                |hostname| |dbname| |user| |password| |WAREHOUSES| |CONNECTIONS| |WARMUP TIME| |BENCHMARK TIME|


&#91;root@CentOS64VM tpcc-mysql&#93;#


&#91;root@CentOS64VM src&#93;# pwd
/home/tools/bazaar/tpcc-mysql/src
&#91;root@CentOS64VM src&#93;# make all
cc load.o support.o `mysql_config --libs_r` -lrt -o ../tpcc_load
cc -w -O2 -g -I. `mysql_config --include`  -c main.c
cc -w -O2 -g -I. `mysql_config --include`  -c spt_proc.c
cc -w -O2 -g -I. `mysql_config --include`  -c driver.c
cc -w -O2 -g -I. `mysql_config --include`  -c sequence.c
cc -w -O2 -g -I. `mysql_config --include`  -c rthist.c
cc -w -O2 -g -I. `mysql_config --include`  -c neword.c
cc -w -O2 -g -I. `mysql_config --include`  -c payment.c
cc -w -O2 -g -I. `mysql_config --include`  -c ordstat.c
cc -w -O2 -g -I. `mysql_config --include`  -c delivery.c
cc -w -O2 -g -I. `mysql_config --include`  -c slev.c
cc main.o spt_proc.o driver.o support.o sequence.o rthist.o neword.o payment.o ordstat.o delivery.o slev.o `mysql_config --libs_r` -lrt -o ../tpcc_start
&#91;root@CentOS64VM src&#93;#
&#91;/SHELL&#93;

<a href="http://variable.jp/wp-content/uploads/2012/07/tpcc-mysql.jpg"><img src="http://variable.jp/wp-content/uploads/2012/07/tpcc-mysql.jpg" alt="tpcc-mysql" title="tpcc-mysql" width="735" height="498" /></a>

<strong>tpcc_loadがデータ生成プログラム</strong>
<strong>tpcc_startが負荷生成プログラム</strong>

[SHELL]
[root@CentOS64VM tpcc-mysql]# pwd
/home/tools/bazaar/tpcc-mysql
[root@CentOS64VM tpcc-mysql]# ls -l
合計 248
-rw-r--r--. 1 root root    749  7月 16 12:50 2012 README
-rw-r--r--. 1 root root   1621  7月 16 12:50 2012 add_fkey_idx.sql
-rw-r--r--. 1 root root    317  7月 16 12:50 2012 count.sql
-rw-r--r--. 1 root root   3105  7月 16 12:50 2012 create_table.sql
-rw-r--r--. 1 root root    763  7月 16 12:50 2012 drop_cons.sql
-rw-r--r--. 1 root root    477  7月 16 12:50 2012 load.sh
drwxr-xr-x. 2 root root   4096  7月 16 12:50 2012 schema2
drwxr-xr-x. 5 root root   4096  7月 16 12:50 2012 scripts
drwxr-xr-x. 2 root root   4096  7月 16 14:09 2012 src
-rwxr-xr-x. 1 root root  60273  7月 16 14:08 2012 tpcc_load
-rwxr-xr-x. 1 root root 153141  7月 16 14:09 2012 tpcc_start
[root@CentOS64VM tpcc-mysql]#

load

TPCC用のDBとユーザーの作成


mysql> create database tpcc;
Query OK, 1 row affected (0.01 sec)

mysql> grant all privileges on tpcc.* to tpcc@'%' identified by 'tpcc-mysql-pass';
Query OK, 0 rows affected (0.14 sec)

mysql>


[root@CentOS64VM tpcc-mysql]# mysql -u tpcc -p tpcc < create_table.sql
Enter password:
&#91;root@CentOS64VM tpcc-mysql&#93;# mysql -u tpcc -p tpcc < add_fkey_idx.sql
Enter password:
&#91;root@CentOS64VM tpcc-mysql&#93;#
&#91;/SHELL&#93;

<a href="http://variable.jp/wp-content/uploads/2012/07/tpcc-create-tables.jpg"><img src="http://variable.jp/wp-content/uploads/2012/07/tpcc-create-tables.jpg" alt="table" title="tpcc-create-tables" width="603" height="298" /></a>

<a href="http://variable.jp/wp-content/uploads/2012/07/tpcc-tables.jpg"><img src="http://variable.jp/wp-content/uploads/2012/07/tpcc-tables.jpg" alt="tables" title="tpcc-tables" width="494" height="296" /></a>
<strong>検証用データのロード</strong>

[SHELL]
[root@CentOS64VM tpcc-mysql]# ./tpcc_load
*************************************
*** ###easy### TPC-C Data Loader  ***
*************************************

 usage: tpcc_load [server] [DB] [user] [pass] [warehouse]
      OR
        tpcc_load [server] [DB] [user] [pass] [warehouse] [part] [min_wh] [max_wh]

           * [part]: 1=ITEMS 2=WAREHOUSE 3=CUSTOMER 4=ORDERS
[root@CentOS64VM tpcc-mysql]#

tpcc_loadにはwarehouseというパラメータを付与する。
warehouse表のレコード数になります。
warehouse表のレコード数によってその他のテーブルのレコード数が決まるので、
この値がスケールファクターになります。
1 warehouse(以下WH)あたりデータベース容量が約100MB増加するとの事。


[root@CentOS64VM tpcc-mysql]# ./tpcc_load localhost tpcc tpcc tpcc-mysql-pass 2
*************************************
*** ###easy### TPC-C Data Loader  ***
*************************************
<Parameters>
     [server]: localhost
     [port]: 3306
     [DBname]: tpcc
       [user]: tpcc
       [pass]: tpcc-mysql-pass
  [warehouse]: 2
TPCC Data Load Started...
Loading Item
.................................................. 5000
.................................................. 10000
.................................................. 15000
.................................................. 20000
.................................................. 25000
.................................................. 30000

[省略]

Orders Done.
Loading Orders for D=8, W= 2
.......... 1000
.......... 2000
.......... 3000
Orders Done.
Loading Orders for D=9, W= 2
.......... 1000
.......... 2000
.......... 3000
Orders Done.
Loading Orders for D=10, W= 2
.......... 1000
.......... 2000
.......... 3000
Orders Done.

...DATA LOADING COMPLETED SUCCESSFULLY.
[root@CentOS64VM tpcc-mysql]#

load data

tpcc_startを実行して負荷をかけ、実際のベンチマーク開始。
※データを更新したりするので、数回実行するのであればバックアップを取得しておいた方が良い。

[root@CentOS64VM tpcc-mysql]$ ./tpcc_start -h
***************************************
*** ###easy### TPC-C Load Generator ***
***************************************
./tpcc_start: option requires an argument -- 'h'
Usage: tpcc_start -h server_host -P port -d database_name -u mysql_user -p mysql_password -w warehouses -c connections -r warmup_time -l running_time -i report_interval -f report_file
[root@CentOS64VM tpcc-mysql]$ 


[root@CentOS64VM tpcc-mysql]# ./tpcc_start -h localhost -d tpcc -u tpcc -p tpcc-mysql-pass -w 2 -c 3 -r 60 -l 120
***************************************
*** ###easy### TPC-C Load Generator ***
***************************************
option h with value 'localhost'
option d with value 'tpcc'
option u with value 'tpcc'
option p with value 'tpcc-mysql-pass'
option w with value '2'
option c with value '3'
option r with value '60'
option l with value '120'
<Parameters>
     [server]: localhost
     [port]: 3306
     [DBname]: tpcc
       [user]: tpcc
       [pass]: tpcc-mysql-pass
  [warehouse]: 2
 [connection]: 3
     [rampup]: 60 (sec.)
    [measure]: 120 (sec.)


[省略]

STOPPING THREADS...

<Raw Results>
  [0] sc:1157  lt:891  rt:0  fl:0
  [1] sc:2047  lt:2  rt:0  fl:0
  [2] sc:206  lt:0  rt:0  fl:0
  [3] sc:205  lt:0  rt:0  fl:0
  [4] sc:148  lt:57  rt:0  fl:0
 in 120 sec.

<Raw Results2(sum ver.)>
  [0] sc:1157  lt:891  rt:0  fl:0
  [1] sc:2047  lt:2  rt:0  fl:0
  [2] sc:206  lt:0  rt:0  fl:0
  [3] sc:205  lt:0  rt:0  fl:0
  [4] sc:148  lt:57  rt:0  fl:0

<Constraint Check> (all must be [OK])
 [transaction percentage]
        Payment: 43.48% (>=43.0%) [OK]
   Order-Status: 4.37% (>= 4.0%) [OK]
       Delivery: 4.35% (>= 4.0%) [OK]
    Stock-Level: 4.35% (>= 4.0%) [OK]
 [response time (at least 90% passed)]
      New-Order: 56.49%  [NG] *
        Payment: 99.90%  [OK]
   Order-Status: 100.00%  [OK]
       Delivery: 100.00%  [OK]
    Stock-Level: 72.20%  [NG] *

<TpmC>
                 1024.000 TpmC
[root@CentOS64VM tpcc-mysql]#

tpcc結果

参考サイト:
tpcc-mysqlによるMySQLのベンチマーク
セグメンテーション違反


FREE、TOPなどでもシステム状況を把握して問題解決やリソースのプランニングが可能だが、
他にもいくつか参考になるコマンドがあるのでメモ。

CPU使用率TOP10
ps auxw | sort -k3 -nr | head -n 10
cpu利用率

MEM使用率TOP10
ps auxw | sort -k4 -nr | head -n 10
mem利用率

パフォーマンス確認に便利なdstat
Usage: dstat [-afv] [options..] [delay [count]]

インストール
[root@ip-xx-xxx-xx-xxx ec2-user]# yum install dstat
Loaded plugins: fastestmirror, priorities, security, update-motd
Loading mirror speeds from cached hostfile
* amzn-main: packages.ap-northeast-1.amazonaws.com
* amzn-updates: packages.ap-northeast-1.amazonaws.com
amzn-main | 2.1 kB 00:00
amzn-updates | 2.3 kB 00:00
Setting up Install Process
Resolving Dependencies
–> Running transaction check
—> Package dstat.noarch 0:0.7.0-1.5.amzn1 will be installed
–> Finished Dependency Resolution

Dependencies Resolved

=======================================================================================
Package Arch Version Repository Size
=======================================================================================
Installing:
dstat noarch 0.7.0-1.5.amzn1 amzn-main 182 k

Transaction Summary
=======================================================================================
Install 1 Package(s)

Total download size: 182 k
Installed size: 660 k
Is this ok [y/N]: y
Downloading Packages:
dstat-0.7.0-1.5.amzn1.noarch.rpm | 182 kB 00:00
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction
Installing : dstat-0.7.0-1.5.amzn1.noarch 1/1

Installed:
dstat.noarch 0:0.7.0-1.5.amzn1

Complete!
[root@ip-xx-xxx-xx-xxx ec2-user]#

dstat –top-bioで最もブロックI/Oしているプロセス確認。
dstat –top-ioで最もI/Oが多いプロセスを確認。

[root@ip-xx-xxx-xx-xxx ec2-user]# dstat --top-bio
—-most-expensive—-
block i/o process
init 66k 726B

[root@ip-xx-xxx-xx-xxx ec2-user]# dstat --top-io
—-most-expensive—-
i/o process
bash 82k 1351B
sshd: ec2-u 146B 248B
sshd: ec2-u 78B 168B
sshd: ec2-u 78B 168B
sshd: ec2-u 78B 168B
sshd: ec2-u 78B 168B
sshd: ec2-u 78B 168B

dstat –tcp でTCPコネクション確認
dstat –net でネットワーク確認

[ip-xx-xxx-xx-xxx]#dstat --tcp --net

net状態

[root@ip-xx-xxx-xx-xxx ec2-user]# dstat --top-cpu
-most-expensive-
cpu process
httpd 0.1
mysqld 1.0

[root@ip-xx-xxx-xx-xxx ec2-user]# dstat --net
-net/total-
recv send
0 0
80B 308B
40B 260B
40B 260B
40B 260B
40B 260B
5925B 35k
1710B 24k
4120B 37k
256B 298B
40B 154B
[root@ip-xx-xxx-xx-xxx ec2-user]#

CPUとネットの状況を同時に確認

[root@ip-xx-xxx-xx-xxx ec2-user]# dstat -a
—-total-cpu-usage—- -dsk/total- -net/total- —paging– —system–
usr sys idl wai hiq siq| read writ| recv send| in out | int csw
1 0 98 0 0 0| 92k 12k| 0 0 | 0 0 | 36 66
0 0 100 0 0 0| 0 0 | 80B 916B| 0 0 | 20 46
0 0 100 0 0 0| 0 0 | 40B 452B| 0 0 | 18 44
0 0 100 0 0 0| 0 0 | 40B 452B| 0 0 | 18 46
0 0 100 0 0 0| 0 0 | 40B 452B| 0 0 | 20 46
0 0 100 0 0 0| 0 0 | 40B 452B| 0 0 | 19 47
0 0 100 0 0 0| 0 0 | 40B 452B| 0 0 | 16 42
0 0 100 0 0 0| 0 0 | 40B 452B| 0 0 | 19 46
1 0 99 0 0 0| 0 0 | 40B 452B| 0 0 | 18 43
[root@ip-xx-xxx-xx-xxx ec2-user]#

-a, --all equals -cdngy (default)
all

dtatオプション

[ip-xx-xxx-xx-xxx]#dstat –help
Usage: dstat [-afv] [options..] [delay [count]]
Versatile tool for generating system resource statistics

Dstat options:
-c, –cpu enable cpu stats
-C 0,3,total include cpu0, cpu3 and total
-d, –disk enable disk stats
-D total,hda include hda and total
-g, –page enable page stats
-i, –int enable interrupt stats
-I 5,eth2 include int5 and interrupt used by eth2
-l, –load enable load stats
-m, –mem enable memory stats
-n, –net enable network stats
-N eth1,total include eth1 and total
-p, –proc enable process stats
-r, –io enable io stats (I/O requests completed)
-s, –swap enable swap stats
-S swap1,total include swap1 and total
-t, –time enable time/date output
-T, –epoch enable time counter (seconds since epoch)
-y, –sys enable system stats

–aio enable aio stats
–fs, –filesystem enable fs stats
–ipc enable ipc stats
–lock enable lock stats
–raw enable raw stats
–socket enable socket stats
–tcp enable tcp stats
–udp enable udp stats
–unix enable unix stats
–vm enable vm stats

–plugin-name enable plugins by plugin name (see manual)
–list list all available plugins

-a, –all equals -cdngy (default)
-f, –full automatically expand -C, -D, -I, -N and -S lists
-v, –vmstat equals -pmgdsc -D total

–bw, –blackonwhite change colors for white background terminal
–float force float values on screen
–integer force integer values on screen
–nocolor disable colors (implies –noupdate)
–noheaders disable repetitive headers
–noupdate disable intermediate updates
–output file write CSV output to file

delay is the delay in seconds between each update (default: 1)
count is the number of updates to display before exiting (default: unlimited)

[ip-xx-xxx-xx-xxx]#

上記オプションを適切に使い分けて、最適なシステム状況診断と
対応が出来るようにしておくと良さそうです。

dstat --cpu --mem --disk --page --int --load --net
general

dstat -N eth0
interface

dstat --time --proc --swap --sys --ipc
date

dstat --full
full

dstat --vmstat
vmstat


--integer 整数値を表示します
--nocolor カラー表示を無効にします
--noheaders ヘッダー表示を無効にします
--noupdate 仲介更新を無効にします
--output file 出力結果を CSV ファイルに書き出します

参考
Dstat: Versatile resource statistics tool


IometerによるディスクI/Oパフォーマンス確認

オペレーティングシステム: すべての 32-bit MS Windows (95/98/NT/2000/XP),
MacOSX, Linux, その他, SunOS/Solaris, Windows NT/2000, Windows XP
Iometer プロジェクト日本語トップページ – SourceForge.JP
Iometer Project

Windows32bit版
http://sourceforge.jp/projects/sfnet_iometer/downloads/iometer-devel/1.1.0-rc1/iometer-1.1.0-rc1-win32.i386-bin.zip/

Windows64bit版
http://sourceforge.jp/projects/sfnet_iometer/downloads/iometer-devel/1.1.0-rc1/iometer-1.1.0-rc1-win64.x86_64-bin.zip/

Linux版
http://sourceforge.jp/projects/sfnet_iometer/downloads/iometer-devel/1.1.0-rc1/iometer-1.1.0-rc1-src.tar.bz2/

以前はIntelのサイトからダウンロード出来たが、現在こちらでダウンロード出来るようです。
インテルは既に開発をやめて、OSDLに提供されたようです。
このツールを利用していたのはベンダーに勤めていた時なので、認識していませんでした。

——————————-
It was originally developed by the Intel Corporation and announced at
the Intel Developers Forum (IDF) on February 17, 1998 – since then it
got wide spread within the industry.

Meanwhile Intel has discontinued to work on Iometer and it was given to the
Open Source Development Lab (OSDL). In November 2001, a project was
registered at SourceForge.net and an initial drop was provided.
——————————-

Windows版をダウンロードして展開
http://sourceforge.jp/projects/sfnet_iometer/downloads/iometer-devel/1.1.0-rc1/iometer-1.1.0-rc1-win32.i386-bin.zip/

※デスクトップなどの日本語のパスがあるフォルダーに置いたら起動時に
エラーが表示されたので日本語が無いパスに移動した。

実行すると以下のような管理画面とコンソールが表示される。
コンソール

※こちらで、サービス起動してPortリッスンして管理画面などのGUIへサービスを提供しているのかな。

管理画面

Worker
iometerを動作させるWindows上で認識できるCPU数と同じだけ表示される。(追加可)

Targets
テスト対象のロジカルドライブを選択(×)

Maximum Disk Size
Sectors単位で指定。指定しない場合、ハードディスクの空き容量すべてが使用される。
512byte/Sector
iobw.tst(4.76 GB、5,120,000,000 バイト)のテストファイルが自動作成される。
ストレステスト実行後自動で削除されません。

セクターの確認(fsutil fsinfo ntfsinfo C:)
sector
今回は、1GBのファイルでテスト(2000000 Sector)で検証。

# of Outstanding I/Os
Queue Depth:ストレージの単純性能値を計るにはDefault(1)で良さそう。

Starting Disk Sector
使用する場合は、windowsのコマンド(fsutil fsinfo ntfsinfo C:)
によって計算するそうだが、今回はDefaultのまま利用。

Network Targets
今回はローカルなので使用しません。

Access Specifications
こちらにストレステストケースを定義します。
Assigned Access Specifications
定義したテストケースが順番に実行され、テストケースは編集する事が可能です。

カスタマイズ
読み・書き込み、Worker、ブロックサイズ(512B:1KB:2KB:4KB:8KB:16KB:32KB:64KB)

Results Display
ストレステストの結果サマリーを確認。

Test Setup
Run Time
Assigned Access Specificationsで定義した1つのテストケースでサンプリング対象とする実行時間
Ramp Up Time
ストレステストケース実行の事前準備時間

全てのWorkerに設定を入れたらテストを実行してみる。
※実行すると結果を保存する為のCSVファイル(results.csv)を保存する場所を聞かれるので、
適当に場所を選んで保存を選択すると実行開始される。

ファイルが作成されている。(テスト後にマニュアル削除)

実行結果をresultタブでも見る事が出来ます。

CSVファイル(results.csv)の中には詳細の数値データが記録されている。

参考
ベンチマーク:Iometerの設定方法・使用方法、ストレージパフォーマンステスト