磯部 和広
k-iso****@rozet*****
2013年 6月 27日 (木) 19:51:38 JST
いつもお世話になっております。 ■概要■ mroongaで、1つのSQLにてマッチした行数を返すタイプの検索を 大量に行っております。 現在、かなり高速に検索できているのですが、更に高速化したいので お知恵をお借りできれば幸いです。 ■背景■ mroongaをインストールしたマシンに、単一のDBを作成し、 単一のmroongaテーブルを作成して使用しています。 テーブルは検索にのみ使用し、insert/delete/update等は一切行いません。 テーブルサイズは4GBで、メモリは32GBです。 CPUはCorei7で、仮想的に8CPUとして見えています。 ユーザーレベルで上げているサービスはmysqldだけです。 /etc/my.cnf にて innodb_buffer_pool_size = 8G を指定しており、mroongaのデータは 該当ディレクトリにて cat * > /dev/null して、メモリキャッシュに乗せてあります。 この状態で vmstat -S m 5 5 すると、下記のようになります。 [k-isobe @ PMJ41 ~]$ vmstat -S m 5 5 procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 6 0 0 25569 3 4683 0 0 0 2 0 4 19 4 77 0 0 7 0 0 25478 3 4683 0 0 0 0 342832 96052 50 11 40 0 0 8 0 0 25370 3 4683 0 0 0 0 266249 72371 67 8 26 0 0 13 0 0 25438 3 4683 0 0 0 0 293404 89771 56 10 34 0 0 8 0 0 25608 3 4683 0 0 0 0 340593 91199 54 10 36 0 0 [k-isobe @ PMJ41 ~]$ 物凄く大量のin/csが発生しており、大量の処理をこなしているのが見て取れます。 また、データがオンメモリで、かつ、検索だけなので bi bo共に0で、DBとしてはかなり良好な状態だと考えています。 この状態でmysqldのCPU使用率は下記のように442%となっています。 CPUが8個あるので、CPU使用率的には800%まで上がる訳ですよね・・・ [k-isobe @ PMJ41 ~]$ ps u -www -C mysqld USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND mysql 18109 442 11.3 21175916 3721212 pts/0 Sl 17:17 540:07 /usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin --user=mysql --log-error=/var/log/mysqld.log --pid-file=/var/run/mysqld/mysqld.pid --socket=/tmp/mysql.sock --port=3306 [k-isobe @ PMJ41 ~]$ 一方、MySQLが何をやっているかを調べると、下記のようになっていました。 [k-isobe @ PMJ41 ~]$ echo 'show processlist' | mysql -u root mysql | wc -l 71 [k-isobe @ PMJ41 ~]$ echo 'show processlist' | mysql -u root mysql | egrep -v 'State|NULL' | cut -f 7 | sort | uniq -c | sort -nr 40 FULLTEXT initialization 3 Sending data 2 statistics 2 optimizing 1 freeing items [k-isobe @ PMJ41 ~]$ 両者に差があるのは、待機状態(Sleep)なセッションがある為です。 ■質問■ Q1. 'FULLTEXT initialization' という状態が出るのは、 どういう状態でしょうか? どうも、groongaを待っているように見えます。 Q2. CPU的には余力があるように見えるので、 接続するクライアントを1.5倍に増やしてみたのですが、 CPUの使用率はさほど上がらず、 'FULLTEXT initialization' の行が増えただけでした。 どうも、groongaの待ち行列が増えただけのように見えます。 パラメータチューニング等で、更に高速化する方法は無いでしょうか。 一応、innodb_read_io_threads=8とは設定してありますが mroongaには、特にオンメモリ状態では効果は無いと考えています。