トップ  > メモ一覧  > カテゴリ「memcached」の絞り込み結果 : 9件

9件中 1 〜 9 表示  1 

No.2502 Memcached

Memcached

出典: Public KFSPedia

目次

[非表示]

CentOS5での使い方

yum install memcached
pecl install memcache
vi /etc/php.d/memcached.ini
extension=memcache.so
 
cat /etc/sysconfig/memcached
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="64"
OPTIONS=""

setとgetの例

vim mem.php
<?php
$memcache = new Memcache;
$memcache->addServer("localhost", 11211);
$memcache->flush();
 
$memcache->set("q1", "1+1は?", 0, 0);
$memcache->set("q1", "1+2は?", 0, 0);
$memcache->set("q2", "人間とは?", 0, 0);
 
$memcache = new Memcache;
$memcache->addServer("localhost", 11211);
echo $memcache->get("q1")."\n";
echo $memcache->get("q2")."\n";
php mem.php
1+2は?
人間とは?

一覧

<?php
$memcache = new Memcache;
$ip = "X.X.X.X";
$port = "11211";
 
$memcache->connect($ip, $port);
$server = "$ip:$port";
 
$all_keys = array();
$slabs = $memcache->getExtendedStats('slabs');
 
foreach ( array_keys($slabs[$server]) as $key) {
    if ($key !== 'active_slabs' && $key !== 'total_malloced') {
        $keys = array_flip(array_keys($memcache->getStats('cachedump', $key, 100000)));
        $all_keys += $keys;
    }
}
 
$key = "";
foreach ( array_keys($all_keys) as $key) {
    echo "$key, ";
    echo $memcache->get($key)."\n\n";
}

全削除(1)

/etc/init.d/memcached restart

削除

引用元

更新:2010/09/28 10:08 カテゴリ: Linux  > memcached ▲トップ

No.2990 memcache in mixi


http://alpha.mixi.co.jp/dist/memcached_in_mixi.pdf

※障害前の資料である点に注意

引用元

更新:2010/09/13 13:11 カテゴリ: Linux  > memcached ▲トップ

No.2951【引用】mixi大規模障害について解明編

mixi大規模障害について 解明編
By Shigeki Morimoto on 8 月 23, 2010 in mixi .

こんにちは、システム本部技術部たんぽぽGの森本です。

span.key {
color: #000000;
background: #FFDDDD;
}

先日のmixi大規模障害の原因となったmemcachedの不具合の詳細な解明ができました。
再来週まで発表を見合わせようと思ったのですが、早くお伝えしたほうがいいと思いましたので公開発表致します。
 
memcachedとlibevent
memcachedはlibeventというライブラリを使用してクライアントからの...

引用元

更新:2010/08/24 01:00 カテゴリ: Linux  > memcached ▲トップ

No.2941 memcachedos.plというのを書いた15

memcachedos.plというのを書いたAdd Stary_yanbe15d5884

21:50 | memcachedos.plというのを書いた - 金利0無利息キャッシング – キャッシングできます を含むブックマーク はてなブックマーク - memcachedos.plというのを書いた - 金利0無利息キャッシング – キャッシングできます

某大手SNSの障害に関連してmemcachedに負荷をかけるツールを書いたので一応書いておく。

最大接続数に達しているときに高速で接続/切断を繰り返すとmemcachedが終了してしまうというもの。

最大10000コネクション試行して、statsコマンド発行する。接続に失敗するか900コネクション以上いってたら切断するという処理。AnyEventを使っている。

http://gist.github.com/522741

クライアント側のCPUコア数に合わせて適当に複数プロセス起動すればより効率的に負荷がかけられるでしょう。手元の環境では数分で安定して落とすことができるけど、サーバーのスペックなんかによっては再現できないかもしれない。

memcachedとlibeventのどちらの問題なのかとか、どこ修正すべきなのかとかは俺の専門ではないので判断しかねる。

動機と目的

  • 実際に発生する問題なのかどうか確かめたかった
  • 沢山サーバー稼働させて再現させてたりして大変そうだったので。
  • 問題解決能力のある人の手元でバグが再現できないと修正されなかったりするので簡単に再現できる必要があると思った

わかったこと

  • memcached1.4.5+libevent1.4.7 on CentOS 4.6 → 落とせた
  • memcached1.4.4+libevent1.4.9 on CentOS 5.4 → 落とせた
  • memcached1.2.6 → 落とせなかった
  • 落ちるときには [err] event_queue_remove: 0x8ab54e0(fd 26) not on queue 8 といったログを吐く。
    • libeventのバージョンが古いとエラーログでないらしい。
  • 最初サーバークライアントを別ホストでやってたけど1台だけでも再現できた。
  • デフォルト設定(-c 1024)では1プロセスでも落とせた。
  • memcached -c 15000 などして最大接続数を引き上げた場合は、落とせなくなった。
    • 接続数が足りなくなるように複数プロセス立ち上げれば落とせた。
  • 不安要素は「ただの高負荷時」でも落ちるのかどうか?なのだけど、最大接続数が足りているのであれば恐らく落ちない。今のところ再現できない。
  • 自社サービスで問題が起きうるかどうか → 問題起きないバージョン使ってる or デフォルト設定で接続数足りてるか、足りないサービスについては-cが大きな数値に増やしてあった。

お願いしたいこと

  • プロトコルが何であれDoSになるので、管理外のサーバーに対して実行するのはやめましょう。
  • memcachedは不安定ではないし、多くの大規模なサイトで使われています。FUDはやめましょう。

一般向けの広報はあくまで「キャッシュサーバーが云々、データベースが云々」なのであって、具体的なプロダクト名を上げるのは技術者向けの情報共有で、コミュニティへのフィードバックです。「memcachedが悪い」とか「memcachedのせい」とか、ましてや責任転嫁とかそういう性質のものではないし、そういう捉え方をするのはとても失礼なので、やめて欲しいなーと思いました。

何か間違ってたり、修正されたりしたら適当なタイミングで追記します。

引用元

更新:2010/08/18 14:21 カテゴリ: Linux  > memcached ▲トップ

No.2934 mixi大規模障害について

mixi大規模障害について

こんにちは。システム本部技術部たんぽぽGの森本です

先日のmixi大規模障害についてのブログです。
はじめにお断りしておきますが、弊社CTOがtwitterで公開した以上の情報はまだ得られておりません。
twitterでは書ききれなかった細部を補足してみたいと思います

現状判明しているのは以下の点です

  • memcachedに大量の接続・切断を行うとmemcachedプロセスが突然終了することがある
  • memcachedには異常時に終了するフローもあるが、同時に出力されるはずのエラーログは出ていなかった
  • coreも出力されていなかった

テスト環境にて追試を行ったところ、なんどか再現させることができましたが、確実に発生する条件は未だ不明です。

障害時の memcachedのバージョンは1.4.4, libeventのバージョンは1.3bです
memcached の起動オプションは以下のとおり

./memcached -vv -p 11222 -u nobody -m 16000 -c 40720 -C -U 0 -t 4 -b 4096

クライアントマシンは 3 台
各クライアントでは 5000 個 fork、1 プロセスでは最大 50 個コネクション生成。最大に達すると 1 つコネクションを再生成し get 命令を 1 つ発行。専用クライアントライブラリでは無く、ソケットを直接操作

クライアントコードは以下

#!/usr/local/bin/activeperl
 
use strict;
use warnings;
 
use IO::Socket::INET;
 
my $host = shift;
my $port = shift;
 
foreach my $sig (keys %SIG){
    next if($sig eq '__WARN__');
    next if($sig eq '__DIE__');
    next if($sig eq 'INT');
    next if($sig eq 'TERM');
    $SIG{$sig} = sub {
        my $sig = shift;
        print "Cought a sig[$sig]\n";
    };
}
 
for(1 .. 50*100){
    foo();
}
sleep 1 while(1);
 
sub foo {
    fork && return;
 
    my @sock;
    for (;;) {
        if(50 < @sock){
            my $nth = int(rand(@sock));
            my $s = splice(@sock, $nth, 1);
            print $s "get foo\n";
            my $ret = <$s>;
            close($s);
            next;
        }
        my $s = IO::Socket::INET->new(PeerAddr => $host, PeerPort => $port, Proto => 'tcp');
        if ($s) {
            print $s "get foo\n";
            my $ret = <$s>;
            print STDERR ".";
            push @sock, $s;
        } else {
            warn "XX [$$]Can't open port:[$!]\n";
            if (@sock) {
                my $nth = int(rand(@sock));
                my $s = splice(@sock, $nth, 1);
                print STDERR "close socket\n";
                print $s "get foo\n";
                my $ret = <$s>;
                close($s);
            } else {
                sleep 1;
            }
        }
    }
}

memcachedにいくつかdebug文を仕込んだところ、以下のことがわかりました。

  • memcached.c:main()にある event_base_loop から抜けていた
    通常はここで無限ループするはず
  • event_base_loop()中の event_haveevents(base) が false を返していた
  • event_haveevents()で base->event_count が0になったため return (base->event_count > 0); で false を返していた

コネクション最大状態で、open/close を激しく繰り返すと発生しやすい印象です。

5000プロセスとかなり負荷を掛けているつもりなのですが再現度はかなり低いです
もしかすると1台のクライアントで同時に行えるopen/closeはコア数が上限になってしまうなどの制限があるのでしょうか
引き続き確実な再現方法と原因究明に向けて調査を行っていきます

引用元

更新:2010/08/16 03:15 カテゴリ: Linux  > memcached ▲トップ

No.2594 memcachedのインストール

memcachedのインストール

wget http://dag.wieers.com/rpm/packages/rpmforge-release/rpmforge-release-0.3.6-1.el5.rf.x86_64.rpm
rpm -ivh rpmforge-release-0.3.6-1.el5.rf.x86_64.rpm
yum install memcached libevent libevent-devel
vi /etc/sysconfig/memcached
/etc/init.d/memcached start
chkconfig memcached on

引用元

更新:2010/06/02 23:24 カテゴリ: Linux  > memcached ▲トップ

No.2501 memcacheの設定ファイルの場所

memcache の設定ファイルの場所
/etc/sysconfig/memcached
更新:2010/05/14 22:04 カテゴリ: Linux  > memcached ▲トップ

No.2296 memcachedの内容を確認するには

memcachedの内容を確認するには


memcachedは便利なんですが、専用のクライアントがないのでどんな項目がどれくらいキャッシュされているかどうかを簡単に知る方法はないようです。ということで、memcachedでどんな内容がキャッシュされているか確認するためのスクリプトを作ってみました。

ソースコード

memcached_status.php

<?php

$memcache = new Memcache;
$memcache->connect('localhost', 11211) or die ("Could not connect");

echo '<html>
<head>
 <title>memcached - cached items</title>
</head>
<body>
<h2>Item Detail</h2>
<form action="" method="get">
  <input type="text" name="cacheKey" value="'
.$_GET['cacheKey'].'"/>
  <input type="submit" value="submit" />
</form>'
;

if( $_GET['cacheKey'] ){
        $key = $_GET['cacheKey'];
        echo "<h3>Key: $key</h3>
        <pre>"
;
        echo var_dump($memcache->get($key));
        echo "</pre>";
}

echo '<h2>Cached Items</h2>
<form action="" method="get">
  <input type="hidden" name="flush" value="1"/>
  <input type="submit" value="flush!" />
</form>
<pre>'
;

if( $_GET['flush']){
        $items = $memcache->getStats('items');
        foreach( $items['items'] as $key => $item ){
                $number = $item['number'];
                $dump = $memcache->getStats('cachedump', $key, $number*2);
                foreach( $dump as $ckey => $carr ){
                        $memcache->delete($ckey);
                }
        }
}

$items = $memcache->getStats('items');

$count = 0;
$ktotal = 0;
$vtotal = 0;

foreach( $items['items'] as $key => $item ){
        $number = $item['number'];
        $dump = $memcache->getStats('cachedump', $key, $number*2);
        foreach( $dump as $ckey => $carr ){
                echo $key,':', $ckey, ': [', $carr[0], 'b; ', $carr[1], 's]', "\n";
                $count++;
                $vtotal += $carr[0];
                $ktotal += strlen($ckey);
        }
}

$total = $vtotal + $ktotal;
echo "--\nkey total:$ktotal b\nvalue total:$vtotal b\ntotal: $total b\ncount:$count\n";
echo '</pre>
</body>
</html>'
;

※2008/05/28追記: コードを少しアップデートしました。

出力結果

こんな感じで出力できます。これでちょっと便利になりました。

1:metatags_3053_2141: [12b; 1186572171s]
1:trackback_2968_828: [7b; 1186572170s]
1:metatags_3053_828: [12b; 1186572169s]
1:googlemaps_2526_2: [0b; 1186572166s]
1:trackback_2971_2: [3b; 1186572165s]
1:metatags_3053_641: [12b; 1186572165s]
1:spambayes_3046_0: [12b; 1186572162s]
1:trackback_2968_1912: [7b; 1186572162s]
1:metatags_3053_1912: [12b; 1186572162s]
1:trackback_2961_0: [10b; 1186572156s]
(中略)
18:SKIN_20_archive: [3275b; 1186572199s]
18:SKIN_20_error: [2931b; 1186572177s]
18:SKIN_31_index: [3468b; 1186571842s]
18:SKIN_20_member: [3175b; 1186569842s]
18:SKIN_20_archivelist: [3519b; 1186569616s]
18:SKIN_20_search: [2932b; 1186505101s]
19:TMPL_mdetailed: [4284b; 1186572201s]
19:SKIN_20_index: [3773b; 1186572152s]
19:TMPL_bluerain/full: [4046b; 1186571919s]
20:SKIN_20_item: [5352b; 1186572186s]
20:SKIN_31_item: [5057b; 1186572118s]
--
key total:210675 b
value total:495633 b
total: 706308 b
count:11750

引用元

更新:2010/04/17 22:27 カテゴリ: Linux  > memcached ▲トップ

No.2295 memcachedを複数起動する(メモ)

memcachedを複数起動する(メモ)

1サーバで扱うデータの中に、なるべく消えて欲しくないセッション情報などのデータと、限界が来たら順次消えて行って良いページ情報などのデータが同居し ていて、どうもキャッシュ漏れ→セッション切れが頻繁に起きているようなので、複数プロセスを立ち上げて管理を別にすることにした。[*1]


本来は1つのコマンドで複数のプロセスを立ち上げるように、initファイルを変更すべきで、実際そういうアイディアもいくつか落ちているんだけど、正直に告白すると読んでもあんまりよく分からなかったので素直に複数のinitファイルを用意した。

参考

Running Multiple MemCache Instances | spf13.com


手順は以下。

1. 設定ファイルをコピー

cp /etc/sysconfig/memcached /etc/sysconfig/memcached_2


2. 設定ファイルを変更

特に、PORTの変更は必須。
デフォルトは11211だと思うので、それ以外の数字に。11212が無難か。


3. initファイルをコピー

cp /etc/init.d/memcached /etc/init./memcached_2


4. initファイルを変更

SYSCONFIG、progを変更。PORTも念のため変更。

progはmemcachedになってると思うので、それ以外の名前に。memcached_2とか。これをmemcachedのままにしておくと、start、stopが上手く動かない。


5. memcachedのシンボリックリンクを作成

ln -s /usr/bin/memcached /usr/bin/memcached_2
4で設定したprog名でmemcachedのシンボリックリンクを作成する。


6. 起動

sudo /etc/init.d/memcached start
sudo /etc/init.d/memcached_2 start
既に起動している場合は再起動で。



正直、全く美しくないけど、3プロセス以上にする予定は今のところないので、「2プロセス動いてるよ」ってことだけ共有出来てれば良いかと…思うんだけど 手抜きだろうか。こういうとき、プログラマの常識を知らない自分としては、恐らく的外れなんだろうなと不安なのだけどまぁ仕方ない。

とりあえずこれで行ってみる。



[*1] 理想の話を言えば、セッション情報はAPサーバ内のローカルmemcachedで管理し、その他の情報については別途サーバを立てるべきなのかも知れないけれども、サーバを増やせないのでこういうことに。
 

引用元

更新:2010/04/17 22:26 カテゴリ: Linux  > memcached ▲トップ
9件中 1 〜 9 表示  1 

FuelPHP

Mac

フロントエンド開発

web開発

プロマネ

マネタイズ

プレゼン

webサービス運用

webサービス

Linux

サーバ管理

MySQL

ソース・開発

svn・git

PHP

HTML・CSS

JavaScript

ツール, ライブラリ

ビジネス

テンプレート

負荷・チューニング

Windows

メール

メール・手紙文例

CodeIgniter

オブジェクト指向

UI・フロントエンド

cloud

マークアップ・テキスト

Flash

デザイン

DBその他

Ruby

PostgreSQL

ユーティリティ・ソフト

Firefox

ハードウェア

Google

symfony

OpenPNE全般

OpenPNE2

Hack(賢コツ)

OpenPNE3

リンク

個人開発

その他

未確認

KVS

ubuntu

Android

負荷試験

オープンソース

社会

便利ツール

マネー

Twig

食品宅配

WEB設計

オーディオ

一般常識

アプリ開発

サイトマップ

うずら技術ブログ

たませんSNS

rss2.0