2012年5月アーカイブ

DeepでもCasualでもない「なにか」ということで開催された MySQL Beginners Talk で、LTしてきました。


サーバ集約して行く過程で気をつけたポイントを紹介しています。このあたり押さえていることで、500台ぐらいあってもそれなり肩の力を抜いて運用できてます。

使っている my.cnf の紹介とかはぜひやってみたいところなんですが、使っているハードウェアのスペックを類推できそうなあたりが難しいところ。


イベントは期待通り(?)Gachinnersで楽しめました。とみたさん、木村さん、nippondanjiさんが発表したインストールや文字コードまわりの話は知らないこともあったのでまだまだ自分も初心者だと思いました。当日の資料はRkajiyamaさんのブログにまとまっているのでそちらを参考に。

CasualもBeginnersもゆるい雰囲気で技術の話ができて、MySQLのコミュニティはほんとすばらしいです

だいぶ以前 Plack::Server::AnyEvent::Prefork というのを書いて某所で使っていたのですが、ここ数日で事例がもうひとつ増えたついでに Twiggy ベースに書き直してCPANリリースしました。

https://metacpan.org/module/Twiggy::Prefork

使うには、

$ plackup -s Twiggy::Prefork -a app.psgi

な感じで、Server::Starterにも対応しているので、

$ start_server --port 5000 -- plackup -s Twiggy::Prefork -a app.psgi

とすれば、hot-deployも可能です。

起動オプションは、Twiggyがサポートしているオプションに加えて、

  • —max-workers preforkするworker数
  • —max-reqs-per-child 1プロセスあたりのリクエスト数
  • —min-reqs-per-child 1プロセスあたりの最小リクエスト数。maxとminとの間でランダムな数字になる

の3つが追加されています。

あと、psgix.exit_guardというリクエストの環境変数からサーバ内部の Condition Variables にアクセスができるようにしてあります。これを使うと 優雅にgraceful shutdownが実現できます。

以下はその例。max-reqs-per-childに達したあと、すぐにプロセスが終了せずに、1個目のasync内のジョブがすべて解消されるまでは待ちます。

use Coro;
use AnyEvent;

my $channel = Coro::Channel->new(100);

async {
  while(1){
    my $q = $channel->get;
    # works..
    $q[0]->end;
  }
};

#psgi app
sub {
  my $env = shift;
  my $cv = AE::cv;
  async {
    $env->{psgix.exit_guard}->begin; 
    $channel->put([$env->{psgix.exit_guard}]);
    $cv->send;
  };
  return sun {
    my $start_response = shift;
    $cv->cb(sub {
      $start_response->([200,['Content-Type'=>'text/plain'],['OK']]);
    });
  }
}

Plack::Server::AnyEvent::Preforkはすでに動作実績があり、そのコードをベースにしているので比較的安心して使えると思います。どうぞお試しください。

Redisをサービスで利用するというので、CloudForecastで監視するプラグインを作ってみました。

監視項目は Percona の Monitoring Plugins を参考にしてます

cf_redis.png



Redis の統計情報は info コマンドを実行すると得られます。telnet でも実行可能です。

info
$1020
redis_version:2.4.11
redis_git_sha1:00000000
redis_git_dirty:0
arch_bits:64
multiplexing_api:epoll
gcc_version:4.1.2
process_id:18078
uptime_in_seconds:781399
uptime_in_days:9
lru_clock:1553555
used_cpu_sys:1.90
used_cpu_user:0.82
used_cpu_sys_children:0.00
used_cpu_user_children:0.00
connected_clients:185
connected_slaves:1
client_longest_output_list:0
client_biggest_input_buf:0
blocked_clients:0
used_memory:2357504
used_memory_human:2.25M
used_memory_rss:4677632
used_memory_peak:3999144
used_memory_peak_human:3.81M
mem_fragmentation_ratio:1.98
mem_allocator:jemalloc-2.2.5
loading:0
aof_enabled:0
changes_since_last_save:0
bgsave_in_progress:0
last_save_time:1336737589
bgrewriteaof_in_progress:0
total_connections_received:29998
total_commands_processed:303740 
expired_keys:0
evicted_keys:0
keyspace_hits:251
keyspace_misses:65
pubsub_channels:41
pubsub_patterns:0
latest_fork_usec:1997
vm_enabled:0
role:master
slave0:10.x.x.x,34080,online
db0:keys=8,expires=1

どれが重要な数字なのかまだわからない