2011年 7月 9日 はてなブックマーク -

このサーバは接続を受け入れきれずに、SYNを取りこぼしてしまっているみたいです。memcachedのbacklogはデフォルト値を使用しているので1024になっているはずです。

$ memcached -h | grep backlog
-b            Set the backlog queue limit (default 1024)

これって、本当に1024で足りなくなっているのでしょうか。単純にバックログを増やせば解決する問題かなと期待しつつも、どうも釈然としなかったので 、man listen をじっくりと読み返していたところ、

backlog 引き数が /proc/sys/net/core/somaxconn の値よりも大きければ、backlog の値は暗黙のうちにこの値に切り詰められる。このファイルのデフォルト 値 は128 である。バージョン 2.4.5 以前のカーネルでは、この上限値はコード埋め込みの固定値 SOMAXCONN であり、その値は 128 であった。

いやーな予感がしたので、おもむろにコマンドを叩いてみると・・・・・

# sysctl net.core.somaxconn
net.core.somaxconn = 128

あちゃあ!
実際はこれ、128になっていたわけですね!

# sysctl -w net.core.somaxconn=1024

としてmemcachedを再起動したところ、大幅に性能が改善されました。

DSAS開発者の部屋:高負荷サイトのボトルネックを見つけるには

TCP接続のリトライが起きているなら変更しておきたい所ですね。
上記設定だとマシンを再起動したら消えてしまう気がします。以下の様に実行すればOKです。
echo “net.core.somaxconn = 1024” » /etc/sysctl.conf
sysctl -p


10ヶ月前 | | 2011年 7月 9日 | このエントリーを含むはてなブックマーク
2011年 4月 16日 はてなブックマーク -
タグ: #KVS #memcache

キャッシュとDB更新の戦略

KVSで登録したデータは、どうがんばっても「キャッシュ」であるとの割り切りが必要だと感じている。

Oracleのコンサルさんも入ってるのでいろいろヒントをもらった。

「ライトスルー/リードスルー/キャッシュアサイド/ライト・ビハインド」という基本的な更新/参照の設計パターンを知っておくだけでも有用だということで、

http://otndnld.oracle.co.jp/document/products/coherence/34/doc_cd/coh.340/B52977-01/readthrough.htm

たしかにこれはヒントになる。



リードスルーは、キャッシュを参照しようとしたエントリがキャッシュになかったときに自動的にDBからロードしてキャッシュに入れるやりかただ。

ライトスルーは、キャッシュ+DB更新が完了するまでput の結果を返さないことでで、更新速度を犠牲にしてでもDBとキャッシュの整合性を担保する方法だ。

キャッシュアサイドとは、DBとキャッシュの更新をそれぞれ別々にアプリケーションが管理するやりかたであり、DBとキャッシュの整合性は厳密には担保できない。


これらのパターンをどだいに、業務内容を分類する必要がある。


僕は、DBへの更新は速度を多少犠牲にするでもいいかと思い始めている。

つまり、まずはJDBCなりでトランザクションありでDBを更新する。

それからキャッシュへのエントリはトランザクションなしでとりあえずputする。

そうして、参照系のみがキャッシュの恩恵を受けるようなやり方をするのはどうだろうかと考えている。

念のためリードスルーでキャッシュミスをカバーする。

KVSの導入検討 - 山本大@クロノスの日記

更新速度を犠牲にしないなら、ACIDの厳密さを犠牲にするなど、KVSではトレードオフを我慢する必要がある。


1年前 | | 2011年 4月 16日 | このエントリーを含むはてなブックマーク
2011年 4月 16日 はてなブックマーク -

最近HandlerSocketの検証で手元のOSXにいれてみたので、その時の手順纏め。


MySQLはhomebrewでinstallしていることが前提
(いまさらmac portsはないよね?)


homebrewでインストールすると

~/Library/Caches/Homebrew

にinstallするときに使ったMySQLのソースコードがtar.gzでそのままあるので、
それをどっかの作業ディレクトリにコピーしましょう。

コーピーしたら、tarを解凍してconfigureします

$ ./configure --prefix=/usr/local LDFLAGS=-L/usr/local/lib CPPFLAGS=-I/usr/local/include --with-mysql=/tmp/mysql-5.1.55 CFLAGS="-I/usr/local/include/mysql -I/usr/local/include" CPPFLAGS="-I/usr/local/include/mysql -I/usr/local/include"



こんなん。

つぎにHandlerSocketの最新版をgithubから取得し、
configure/make/make installします

$ ./configure --with-mysql-source=/tmp/mysql-5.1.55 --with-mysql-bindir=/usr/local/bin
$ make
$ make install

これでinstall自体は終了しているので一度mysql.server startでmysqldを立ち上げます。

たちあげたmysqlに接続し

mysql> install plugin handlersocket soname 'handlersocket.so';

と一発打ち込みます。

その後、my.cnfにhandlersocketの設定を書いてmysqldを再起動すれば完了です。
ちゃんとhandlersocketが立ち上がってるかは

mysql> show processlist;
+----+-------------+-----------------+---------------+---------+------+-------------------------------------------+------------------+
| Id | User        | Host            | db            | Command | Time | State                                     | Info             |
+----+-------------+-----------------+---------------+---------+------+-------------------------------------------+------------------+
|  1 | system user | connecting host | NULL          | Connect | NULL | handlersocket: mode=rd, 0 conns, 0 active | NULL             |
|  2 | system user | connecting host | handlersocket | Connect | NULL | handlersocket: mode=wr, 0 conns, 0 active | NULL             |
|  3 | root        | localhost       | NULL          | Query   |    0 | NULL                                      | show processlist |
+----+-------------+-----------------+---------------+---------+------+-------------------------------------------+------------------+

と出ておればOKです。

https://github.com/ahiguti/HandlerSocket-Plugin-for-MySQL/blob/master/docs-ja/installation.ja.txt

このあたりを参考にすればハマることなくinstallできるとおもいます。


最新のHandlerSocketではSQLのIN相当のことが出来るように変更を入れてもらったので、
より幅広い使い方ができますね!

OSXにHandlerSocketを入れる

1年前 | | 2011年 4月 16日 | このエントリーを含むはてなブックマーク
2011年 1月 13日 はてなブックマーク -

2010-06-26

Membase vs memcached vs TokyoTyrant vs Redis

Membaseを入れてみたので、実際にどれくらいの速度が出るのか試してみました。

memcached vs TokyoCabinet vs TokyoTyrant vs Redis - blog.katsuma.tv

この記事のパクリですね。これにMembaseを加えてみた感じです。

クライアントによって速度が変わるのが嫌だったので、すべてPythonmemcachedクライアントを使って、1万回setを行いその時間を計測してみました。

Membase1.18884205818
memcached0.683738946915
TokyoTyrant0.788640022278
Redis0.642278909683

思ったよりMembaseが遅い…。って言うかRedis速い。

まとめ

使おう!Redis!APIも豊富だし、レプリケーションとかも簡単らしいよ!

Membase vs memcached vs TokyoTyrant vs Redis - とはえ領域

Redisいいかも。PHPからも使えるらしいです。
http://stbr.no-ip.org/daizu/2010/02/phpredis-predis.html


1年前 | | 2011年 1月 13日 | このエントリーを含むはてなブックマーク
2010年 12月 7日 はてなブックマーク -
  • 2010年10月 5日(火) 14:33 JST
  • 投稿者:
    nonoz

memcachedを使おうとして yum memcachedしたら「Net::SSLeayが1.33以上じゃないと使えないよ」という意のメッセージがでてインストールできませんでした。イン ストールしているperl-Net-SSLeayパッケージを調べてみると、あれ?1.30です。どうやらrpmforgeのperl-Net- SSLeayをインストールしなきゃいけないようです。

ということで、「yum —disablerepo=addons —disablerepo=base —disablerepo=extras —disablerepo=updates install perl-Net-SSLeay」で perl-Net-SSLeayをrpmforgeから入れ直し。無事yum memcachedできました。

rpmforgeって意外と躓くことありますね。

perl(Net::SSLeay) >= 1.33 is needed - NzLab

使っているrpmforge-releaseのパッケージが古いと古いレポジトリを見てしまい、さらにつまづきます。
yum upgrade rpmforge-releaseをしてからであれば、perl-Net-SSLeayの1.33が入ります。


1年前 | | 2010年 12月 7日 | このエントリーを含むはてなブックマーク
2010年 9月 9日 はてなブックマーク -
タグ: #memcache

安全なincrement

現在のmemcachedの最新バージョンである1.4.5ではマルチスレッド動作時にincrコマンドが正しく行われないバグがあることが知られ ています。incrコマンドを繰り返すと数値の繰り上がりにより桁数が増えます。桁数が変わるとキャッシュオブジェクトのサイズが変わ り,memcached内部のスラブの移動が必要となります。その際の動作がスレッドセーフではないため,スラブ移動中にインクリメントした情報が失われ ることがあります。

Issue 127: incr/decr operations are not thread safe.
http://code.google.com/p/memcached/issues/detail?id=127

バッドノウハウですが,incrコマンドを発行する際に十分な大きなスラブにデータが保存されるように細工することで,現在のmemcachedのバージョンでも問題を回避できます。

sub counter {
    my $self = shift;
    my $key = shift;
    my $result = $memd->incr($key, @_);  -----(1)
    if ( defined $result && ! $result ) {
        my $init = shift || 1;
        $memd->add($key, sprintf("%-20d", 0), @_ );  -----(2)
        $result = $memd->incr($key, $init, @_ );
    }
    $result;
}

上記のコードではmemcachedのincrメソッドを利用してカウンターを実装しています。まず(1)でincrを実行し,値が取得できなけれ ば,(2)で初期値をmemcachedに保存します。その際に,空白を入れて全部で20文字のキャッシュオブジェクトを生成します。20文字あれば2の 64乗までの数値が全て入るため,どんなにincrを繰り返してもキャッシュオブジェクトのサイズが変わらないので,memcachedサーバ上のスラブ が移動することがなくなり,バグを回避できます。

memcachedの活用と運用 実践編:第4回 memcachedを快適に利用するTips集 |gihyo.jp … 技術評論社

1年前 | | 2010年 9月 9日 | このエントリーを含むはてなブックマーク
2010年 8月 26日 はてなブックマーク -
タグ: #PHP #memcache #memcached

$memcached->addServer(‘localhost’, 11211);

$key = ‘hoge’;
$value1 = ‘fuga’;
$value2 = ‘mote’;

$memcached->set($key, $value1);
$cas = null;
$resultValue = $memcached->get($key, null, $cas);
assert($resultValue === $value1); //fugaが返される

$success = $memcached->cas($cas, $key, $value2);
$resultValue = $memcached->get($key, null, $cas);

assert($success === true); //更新は成功
assert($resultValue === $value2); //更新されmoteが返される


$memcached->set($key, $value1);
$resultValue = $memcached->get($key, null, $cas);

$memcached->set($key, $value1); // 取得したあとに誰かがもう一度セットしたとする

//更新しようとする
$success = $memcached->cas($cas, $key, $value2);

assert($success === false); //更新失敗
assert($resultValue === $value1); //更新されずhogeが返される

ウノウラボ Unoh Labs: リビドーに赴くままlibmemcachedをPHPから使ってみる

CASを使った一貫性のサンプルです。
rpm化しつつのインストール方法も解説されています。


1年前 | | 2010年 8月 26日 | このエントリーを含むはてなブックマーク
2010年 8月 13日 はてなブックマーク -
タグ: #memcache #mixi
  • とりあえず今のところの調査履歴をblogに書いてみた > http://bit.ly/bSGMYi #mixi
    kzk_mover
    2010-08-13 00:57:34
  • けどよくわからんなーくそーくそー
    kzk_mover
    2010-08-13 00:57:59
  • mixiの問題を再現出来ている出来ていないに関わらず、fd溢れた時に止まる問題は明日報告しよう…
    kzk_mover
    2010-08-13 01:04:30
  • うお!Thanks!こちらの検証環境についての詳細も明日ブログにあげれるか担当者と相談します RT @kzk_mover: とりあえず今のところの調査履歴をblogに書いてみた > http://bit.ly/bSGMYi #mixi
    nealsato
    2010-08-13 01:11:56
  • ニコニコのコメントサーバーは広場で結構セッション数あるけど、とりあえずlibeventではなく生でepoll使ってるからlibeventの問題については影響なさそうだ
    koizuka
    2010-08-13 01:51:32
  • ニコニコ広場のサーバーは同時セッション数(TCP持続)が1台あたりピークタイムで5万超えぐらいか
    koizuka
    2010-08-13 01:56:07
  • @nealsato 接続数が増えた時のあからさまなメモリ破壊を発見しました。-cを超えた時に発動します。新しいlibeventでは色々治っているみたいなので、素直にlibeventをupgrade=>検証するのも筋かもです… > http://bit.ly/ceQmgP
    kzk_mover
    2010-08-13 03:09:06
  • Togetter - 「mixiがはまったmemcached(or libevent?)の問題を調べる人たち」

    1年前 | | 2010年 8月 13日 | このエントリーを含むはてなブックマーク
    2010年 8月 13日 はてなブックマーク -

    [速報]mixiが障害の経緯を発表。原因はお盆のアクセス急増ではなく、memcachedの異常終了

    2010年8月12日

    8月10日の17時20分頃から12日未明までの長時間にわたり、サービスが利用不能もしくは利用しにくい状況になっていた「mixi」。数度の断続的な復旧ののちに、本日12日午前1時50分頃には復旧が完了し、現時点で全面的に復旧しているようです。

    『mixi』のアクセス障害のお詫び及び復旧に関するお知らせ « 株式会社ミクシィ

    その障害の経緯について株式会社ミクシィの広報からプレスリリース「『mixi』のアクセス障害のお詫び及び復旧に関するお知らせ」として発表されました。

    原因はアクセスの急増ではなかった

    プレスリリースの中で、今回の障害の原因は以下のように説明されています。

    『mixi』のデータベースへの負荷軽減のために導入しているデータキャッシュシステムが複数同時に異常終了したことに伴い、データベースへの負荷が急増したため『mixi』を閲覧しづらい状態となりました。

    高負荷かつ特殊な状態でのみデータキャッシュシステムの異常終了が発生していたため、根本的な原因の究明に時間がかかることとなりました。

    mixiはキャッシュシステムとしてオープンソースのmemcachedを利用しており、上記の「データキャッシュシステム」もmemcachedのことを指しているようです。

    同社CTOの佐藤ニール氏は、Twitterで次のように原因をツイートしています。

    二日とも複数台のmemcachedが連続して落ちました。コアは吐かずにストンと落ちるので、原因追及に時間がかかりましたが、memcachedへの接続数が異常に多いと落ちる事は再現できました。 #mixiless than a minute ago via TweenNeal Sato
    nealsato

    mixiの障害の原因として「夏休みやお盆などでアクセスが急増したのでは?」などの推測が一部で流れていましたが、そうしたmixiへのアクセスが急増したためではなく、システム内のサーバ追加によるとのこと。

    memcachedが大量の接続を受けると突然停止をするので、memcachedへの接続数を減らし安定運用中。外部からの過剰アクセスではなく、サーバ追加→クライアント数増加→停止。less than a minute ago via TweenNeal Sato
    nealsato

    再発防止策として、以下のような施策を実行するとプレスリリースで説明されています。

    1.データキャッシュシステムへの負荷を軽減する措置を施す
    2.将来的に負荷が増加した場合に備え、問題が発生した際にもデータキャッシュシステムが異常終了せず処理を継続して高い堅牢性を保つ手法を調査する
    3.データキャッシュシステムの障害が『mixi』のシステム全体に影響しないよう、影響範囲の局所化を検討、実施する

    memcachedはmixiだけでなく多くの大規模サイトで使われている技術です。今回の障害の原因についてさらに分析をすすめて、共有できるような教訓があればぜひ公開していただきたいと思います。

    [速報]mixiが障害の経緯を発表。原因はお盆のアクセス急増ではなく、memcachedの異常終了 - Publickey

    「memcached-1.4.4 + libevent-1.3b、memcachedの接続数30kの設定に対して30k以上投げ続けると、base_event_loopからなぜか抜けてしまいます」という情報がtwitterであります。
    memcachedの接続数はファイルディスクリプタでの制御に過ぎないから、libeventでの不具合の追求結果を待っているところです。


    1年前 | | 2010年 8月 13日 | このエントリーを含むはてなブックマーク
    2010年 6月 25日 はてなブックマーク -
    タグ: #KVS #memcache #memcached

    memcachedの開発者らが中心となって今年の3月に立ち上げた企業NorthScaleが、memcached互換のNoSQLデータベース「Membase」のオープンソースプロジェクト「membase.org」を6月23日に発表しました。

    MembaseはWebアプリケーションのバックエンドに使われることを想定したキーバリュー型データストア。高速かつ高いスケーラビリティを目指したもの。

    主な機能として、将来にわたってmemcashedとプロトコルの互換性を保証しつつ、ディスクへの永続性機能(データのディスクへの書き込み)、階層型データストア管理、データレプリケーション、稼働状態での設定変更とノード間のリバランシング機能なども備えると説明されています。

    memcached互換のNoSQLデータベース「Membase」がオープンソースで登場 - Publickey

    またまた良いものが出てきました。


    1年前 | | 2010年 6月 25日 | このエントリーを含むはてなブックマーク
    2010年 6月 23日 はてなブックマーク -
    タグ: #KVS #memcache #memcached
    #!/bin/bash
    #
    # Init file for memcached
    #
    # Written by Dag Wieërs 
    #
    # chkconfig: - 80 12
    # description: Distributed memory caching daemon
    #
    # processname: memcached_session
    # config: /etc/sysconfig/memcached_session
    # config: /etc/memcached_session.conf
    
    source /etc/rc.d/init.d/functions
    
    ### Default variables
    PORT="11212"
    USER="nobody"
    MAXCONN="1024"
    CACHESIZE="64"
    OPTIONS=""
    SYSCONFIG="/etc/sysconfig/memcached_session"
    MEMCACHED="/usr/bin/memcached"
    MEMCACHED_SESSION="/usr/bin/memcached_session"
    
    ### Read configuration
    [ -r "$SYSCONFIG" ] && source "$SYSCONFIG"
    
    RETVAL=0
    prog="memcached_session"
    desc="Distributed memory caching"
    
    start() {
            echo "searching $prog"
            if [ -e $MEMCACHED_SESSION ]
            then
                    echo "$prog exist"
            else
                    ln -s $MEMCACHED $MEMCACHED_SESSION
            fi 
            echo -n $"Starting $desc ($prog): "
            daemon $prog -d -p $PORT -u $USER -c $MAXCONN -m $CACHESIZE $OPTIONS
            RETVAL=$?
            echo
            [ $RETVAL -eq 0 ] && touch /var/lock/subsys/$prog
            return $RETVAL
    }
    
    stop() {
            echo -n $"Shutting down $desc ($prog): "
            killproc $prog
            RETVAL=$?
            echo
            [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/$prog
            return $RETVAL
    }
    
    restart() {
            stop
            start
    }
    
    reload() {
            echo -n $"Reloading $desc ($prog): "
            killproc $prog -HUP
            RETVAL=$?
            echo
            return $RETVAL
    }
    
    case "$1" in
      start)
            start
            ;;
      stop)
            stop
            ;;
      restart)
            restart
            ;;
      condrestart)
            [ -e /var/lock/subsys/$prog ] && restart
            RETVAL=$?
            ;;
      reload)
            reload
            ;;
      status)
            status $prog
            RETVAL=$?
            ;;
       *)
            echo $"Usage: $0 {start|stop|restart|condrestart|status}"
            RETVAL=1
    esac
    
    exit $RETVAL
    @wieers.com>

    memcachedを複数起動する起動スクリプト - netmark.jp

    pid分けて起ち上げるだけですが、意外と便利そうです。


    1年前 | | 2010年 6月 23日 | このエントリーを含むはてなブックマーク
    2010年 6月 23日 はてなブックマーク -
    タグ: #PHP #KVS #memcache

    [PHP][memcached] phpセッションmemcached を使う

    CentOSの場合

    • install

    rpmforgeのレポジトリが入っていない人は以下の手順で追加

    # wget http://dag.wieers.com/packages/rpmforge-release/rpmforge-release-0.3.6-1.el5.rf.i386.rpm
    # rpm -Uhv rpmforge-release-0.3.6-1.el5.rf.i386.rpm
    
    # yum install libevent memcached php-pecl-memcache
    
    • 設定

    /etc/php.ini を以下のように編集

    session.save_handler = memcache
    session.save_path = "memcached.example.com:11211"
    

    /etc/sysconfig/memcached を以下のように適当に編集する。

    PORT="11211"
    USER="nobody"
    MAXCONN="1024"
    CACHESIZE="64"
    OPTIONS=""
    
    • スタート

    memcached デーモンをスタート

    # chkconfig memcached on
    # service memcached start
    

    Apacheをリスタート

    # service httpd restart
    
    • 各種設定

    パケットキャプチャみると、各値の有効期限が、1440秒になっている。設定場所がわからない。

    ソースを見てみると、

    memcache_session.c:		if (mmc_pool_store(pool, "set", sizeof("set")-1, key_tmp, key_tmp_len, 0, INI_INT("session.gc_maxlifetime"), val, vallen TSRMLS_CC)) {
    

    session.gc_maxlifetime を使っているのが分かる。

    これで、有効期限を設定できた。

    php のセッションにmemcached を使う - Sleepless geek in Seattle

    スタンダードなmemcacheの場合は「session.gc_maxlifetime」を見ている。TokyoTyrant系はどうなっているのか・・・


    1年前 | | 2010年 6月 23日 | このエントリーを含むはてなブックマーク