当ブログをご覧のみなさまこんにちは。さくらインターネット研究所の大久保です。
今回はFlareのスループット測定を行いましたので、そちらについてご紹介をしたいと思います。
測定環境
今回の測定では、1台のストレージサーバに対して、負荷生成プログラムを動作させた多数のプロキシサーバからクエリを投げ、ストレージサーバ1台あたりのSet/Getスループットを測定します。
測定環境ですが、当研究所では以下のような構成でKVS評価用に50台のサーバを用意しております。
今回はそのうち42台のサーバを用いて測定を行いました。各役割のサーバの台数は以下の通りです。
| 役割 | 台数 |
|---|---|
| インデックスサーバ | 1台 |
| ストレージサーバ | 1台 |
| プロキシサーバ(負荷生成サーバ) | 40台 |
全てのサーバは同じものを設置しており、スペックは以下の通りです。
| 項目 | スペック |
|---|---|
| CPU | Xeon 2.0GHz (2Core) |
| Memory | 4GB |
| HDD | SCSI 37GB |
| NIC | 1000Base-T |
| OS | CentOS 5.4 |
サーバの設定
各サーバ上で起動するFlareの設定は以下の通りです。
- インデックスサーバの設定
data-dir = /home/admin/flare
log-facility = local0
server-name = 192.168.13.21monitor-threshold=3
monitor-interval=1
monitor-read-timeout=1000 - ストレージサーバの設定(プロキシサーバも同じ)
※ server-nameは各サーバのIPアドレスに置き換える。data-dir = /home/admin/flare
log-facility = local0
storage-bucket-size = 16777216
index-server-name = 192.168.13.21
server-name = 192.168.13.22 - インデックスサーバにてストレージサーバの役割設定
% telnet localhost 12120
node role 192.168.13.22 12121 master 1 0
負荷生成プログラム
以下のような負荷生成プログラムを40台のプロキシサーバにて10分間走らせ、各プロキシサーバで処理できたクエリ数を合計し、1秒間あたりに処理可能なクエリ数を計算します。
- 負荷生成プログラム(set)
#!/usr/bin/env perl
use Cache::Memcached;
$start = shift;die unless ($start =~ /^\d+$/);
$end = shift; die unless ($end =~ /^\d+$/);my $a = Cache::Memcached->new({'servers' =>["127.0.0.1:12121"],'select_timeout' =>100.0,'connect_timeout' =>2.0});
$value = "01234567890123456789012345678901234567890123456789";
foreach ($start .. $end){
$key = sprintf("test%08d",$_);
unless ($a->set($key,$value)){
warn "set failed $_\n";
sleep(1);
redo;
}
if ($_ % 1000 == 0){
print "$_ done.\n";
}
} - 負荷生成プログラム(get)
#!/usr/bin/env perl
use Cache::Memcached;
$max = shift;die unless ($max =~ /^\d+$/);
my $a = Cache::Memcached->new({'servers' =>["127.0.0.1:12121"]});
$value = "01234567890123456789012345678901234567890123456789";
$count = 0;
while(1){
$key = sprintf("test%08d",int(rand($max)));
unless ($data = $a->get($key)){
warn "get failed $key\n";
sleep(1);
redo;
}
if ($data ne $value){
warn "value inconsistent $key ->$data\n";
}
$count++;
if ($count % 1000 == 0){
print "$count done.\n";
}
}
キー名、値、レコード数は以下の通りとなります。
- キー名:test00000000〜test03999999
- 値:01234567890123456789012345678901234567890123456789 (50bytes)
- レコード数:400万件
測定結果
比較のために、上記と同様の構成でmemcachedを用いた場合の測定も行いました。結果を以下に示します。
| ソフトウェア | Set[queries/sec] | Get[queries/sec] |
|---|---|---|
| memcached | 80,838 | 111,420 |
| Flare | 31,933 | 73,681 |
memcachedは完全にオンメモリで動作しますので単純な比較はできませんが、Flareはmemcachedに比べ、Setは約1/2.5、Getについては約1/1.5の性能を有することがわかります。
まとめ
今回は1台のストレージサーバあたりのスループットをFlareとmemcachedで比較してみました。分散KVSではサーバを追加するだけで性能を簡単に増やすことができますので、クエリが均等に分散する理想状態においては、パーティションを2つに増やせば2倍、3つに増やせば3倍になるはずです。そこで、クエリがどの程度分散するかについて今後検証を行う予定です。


