ブックマーク / sfujiwara.hatenablog.com (34)

  • ISUCON11で優勝しました - 酒日記 はてな支店

    勝った!!引退!!! 取り乱しました。 ずっと参加してきているWebアプリケーションパフォーマンスチューニングコンテスト ISUCON、ISUCON11選にチーム「fujiwara組」で参加して、優勝しました。 ISUCON11 まとめ : ISUCON公式Blog fujiwara組は初回のISUCONから参加している老舗チームで、自分(fujiwara)以外のメンバーは都度入れ替わっているのですが、今回はISUCON10の時と同様に会社(面白法人カヤック)の同僚である acidlemon と macopy とのチームです。 チーム紹介スライド 過去に ISUCON1, 2, 5 で優勝しているので、6年ぶり4度目の優勝になりました。もう引退していいよね!(というか941さんに出禁って言われた気がする…) やったこと リポジトリはこちらです。 github.com アプリケーションの変

    ISUCON11で優勝しました - 酒日記 はてな支店
    oranie
    oranie 2021/09/21
    おめでとうございます!
  • Amazon SQSを利用してS3からRedshiftにデータ投入するRinというツールを書いた - 酒日記 はてな支店

    fluentdで集約したログをRedshiftに投入するのに、これまでは fluent-plugin-redshift を使っていたのですが、諸々の理由でこれを置き換えるツールをGoで書きました。 Rin - Redshift data Importer by SQS messaging. プロダクション環境に投入して、2週間ほど快調に動作しているので記事を書いておきます。 アーキテクチャと特徴 S3にデータが保存されたタイミングで、Amazon SNS または SQS にメッセージを飛ばすイベント通知機能がありますので、それを利用しています。 (何者か) S3 にデータを保存する (fluent-plugin-s3, その他どんな手段でも可) (S3) SQS に S3 の path 等が記述されたメッセージを通知する (Rin) SQS のメッセージを受信し、Redshift へ CO

    Amazon SQSを利用してS3からRedshiftにデータ投入するRinというツールを書いた - 酒日記 はてな支店
    oranie
    oranie 2015/05/20
  • ISUCON4本選で3位に敗れました #isucon - 酒日記 はてな支店

    ISUCON4 に「fujiwara組」として参戦しましたが、既報のとおり 3位に敗れてきました。順位こそ3位で賞金10万円は獲得できたものの、スコアが示すとおり内容的には完敗です。 まずは主催のLINE社様、出題を担当していただいたCookpad社様、番サーバ提供をしていただいたテコラス社様にお礼申し上げます。当に楽しいイベントをありがとうございました。 うちのチームとしてやったことは #isucon 4の戦で3位を取ってきました (追記あり) - beatsync.net に大変詳しいので、そちらをご参照ください。 簡単に最終的な構成をまとめると Redisは1号機に(動画以外)集約 動画はアップロードを受けたサーバがローカルファイルとして保存しnginxが返す。保存されたサーバのアドレスをメタデータとしてRedisに保存し、APIへのレスポンスに含まれるURLを構築するのに使用

    ISUCON4本選で3位に敗れました #isucon - 酒日記 はてな支店
    oranie
    oranie 2014/11/10
  • Redisでログの書き込みがblockを引き起こす - 酒日記 はてな支店

    「RedisかわいいよRedis」(by typester)……というほど自分は Redis 期でもないのですが、最近 Redis を使ったサービスの面倒を見ていて時々レスポンスが悪化する現象に出会ったので調べました。 前提 使用しているのは Redis 2.4.16 です。 redis.conf に "save [t] [n]" を定義すると、最後に save をしてから [t]秒間に [n]個以上の key が更新された場合に background で save (=bgsave) が実行されます。 save 60 10000これだと、60秒間に 10,000 keys です。 bgsave では redisは自分自身のプロセスを fork() し、子プロセス側は自分のメモリに乗っている内容をファイルにすべて書き出します。 この仕組みによって、1プロセス 1スレッドで動作している re

    Redisでログの書き込みがblockを引き起こす - 酒日記 はてな支店
    oranie
    oranie 2014/03/05
  • 社内Gyazoの画像をAmazon S3に逃がしてスケーラブルに運用する - 酒日記 はてな支店

    Gyazo、便利ですよね。大変便利なので、社内でプライベートなGyazoサーバを用意して使っている会社も多いと思います。 うちでもサーバのパフォーマンスは特に必要ないので社内に適当なVMを立てて運用していたのですが、数年単位で運用していると画像ファイルが増えていくためdiskをなんとかする必要に迫られました。 ここでどんどん増えるファイルはAmazon S3に逃がそう、という自然な発想に至るわけですが、Gyazoサーバアプリが投稿を受けたときにS3にアップロードするような改修をするのは年末の忙しい時期に面倒。楽したい。 ということで S3 と nginx を組み合わせていいかんじに運用できるようにしてみました。 Gyazoに限らず、 ローカルに書き込んだファイルをhttpで閲覧する 一度書き込まれたファイルには変更がない ファイルは消えないでどんどん増える ようなものには応用できると思いま

    社内Gyazoの画像をAmazon S3に逃がしてスケーラブルに運用する - 酒日記 はてな支店
    oranie
    oranie 2013/12/26
  • ISUCON3 を開催しました - 酒日記 はてな支店

    参加者の皆様、共催で運営となった LINE, DataHotel, カヤック各社の皆様、当にありがとうございました。いくつかトラブルがあったものの、選もなんとか無事に終えることができました。 まずは優勝した LINE 選抜チームの皆様、おめでとうございます!なかなか初期スコアから上がってこないので内心ものすごく心配していましたが、ポイントを見極めて作業が終わったところで一気にスコアを上げてきたのは感服しました。 選終了から48時間経過したいまでも頭の疲労が回復しきっていない感じで、整理できていないので思うままにつらつら書きます。 以下長文になってしまうので最初に告知です。 ISUCON3反省会 というイベントを 11/15(金) に行います。ISUCON参加者でなくてもどなたでも無料でプレミアムモルツ飲み放題ですので、日時が迫っていますが是非お越しください。 出題内容について お題は

    ISUCON3 を開催しました - 酒日記 はてな支店
    oranie
    oranie 2013/11/12
    お疲れ様でした
  • ISUCON3 予選を開催しました - 酒日記 はてな支店

    出題担当なのですが正式名称が ISUCON3 なのか ISUCON 2013 なのか未だによく分かってない今日この頃です。 それはともかくとして、200名以上の皆様に参加していただいて ISUCON の予選を盛況のうちになんとか終えることができました。 スコアの算出方法が公表されていなかったり 基的に静的ファイル以外の1リクエストが1点 (ただしPOST→リダイレクト→GETは1点)、静的ファイルは0.02点、css扱いで で読まれるのは 0点、でした Failについては合計3まで減点なし、それ以上は (Fails - 3)^2 * % を減点するので合計 Fails 13 で (10*10)% = 100% 減点でスコア0になります 想定していない /recent/* 荒稼ぎポイントがあったり 初日の競技中に気がついて、何チームぐらいここで稼いでくるかと思いましたがやはり60チーム以上

    oranie
    oranie 2013/10/10
  • 新しいPerlに今まで使ってたモジュールをまとめてインストールする - 酒日記 はてな支店

    Perl-5.12.1 がリリースされたということで早速インストールされたかたも多いと思いますが、新しい Perl にモジュールを全部入れ直すのは面倒ですよね。 ExtUtils::Installed を使うと楽ができます。 今まで使ってる perl でインストールされているモジュールの一覧をファイルに落として、新しい perl で cpanm にわせるだけです。 $ cpanm ExtUtils::Installed $ perl -MExtUtils::Installed -e 'print "$_\n" for ExtUtils::Installed->new->modules' > modules.txt $ perlbrew switch perl-5.12.1 $ cpanm < modules.txtあと、perlbrew でインストールした直後は cpanm も perl

    新しいPerlに今まで使ってたモジュールをまとめてインストールする - 酒日記 はてな支店
    oranie
    oranie 2013/06/28
  • MySQLでデータ領域をシステムと別diskにするならtmpdirも設定した方がいい - 酒日記 はてな支店

    某所に300ホスト以上を2年ほど監視していたZabbixのMySQLがありまして、データが100GBぐらいになってメモリ8GBのホストではdisk IOが辛くなってきたので、移行することにしました。普段はそんなにでもないのですが、housekeeperが動作して古いデータを消しに行くとバッファプールに乗っていない部分に読みに行って重いのです。 この際折角なので Intel S3700 (サーバ用のSSD) をおごり、 Zabbix-1.8 から 2.0 にアップグレード MySQL-5.0.77 から MySQL-5.6.11 に変更 システムは HDD で /dev/sda1 データは SSD で /dev/sdb1 を /data にマウント という構成で移行の検証を行っていたところ… MySQLのバージョンが大きく上がるので mysqldump を取得して restore 後、pat

    oranie
    oranie 2013/04/24
  • Unbound で一部の名前だけ置き換える DNS cache サーバを立てる - 酒日記 はてな支店

    とある特定の名前だけ、来のとは別の IP アドレスを返したい場面というのが開発中によくあります。 (追記) PCならば hosts を書き換えればいいのですが、iPhoneなどそういう手段が容易にとれない端末に対して行いたい Unbound を使ってそのような DNS cache サーバを立てるメモ。 homebrew で Unbound をインストール。 $ brew install unboundlocal-data で書き換えたいレコードを定義。 /usr/local/etc/unbound/unbound.conf server: interface: "0.0.0.0" access-control: 192.168.0.0/24 allow username: "nobody" local-data: "foo.example.com A 192.168.0.10"一時的に動

    Unbound で一部の名前だけ置き換える DNS cache サーバを立てる - 酒日記 はてな支店
    oranie
    oranie 2013/02/26
  • MongoDBをNUMAなマシンで使うときの注意 - 酒日記 はてな支店

    デュアルCPUで計12コア24スレッド、メモリ48GBというマシンで MongoDB-2.0.8 をしばらく稼働させたところ、突然 CPU の system time が1コア分暴走したようになる、という現象が起きました。 最初は原因がよく分からず、とりあえず mongod のプロセスを kill して起動し直したら復旧したのですが、またしばらくすると同じ現象に。 mongoのメモリ使用量と Load Average をプロットしてみると、どうもある程度 (約24GB?) のメモリを使ったところで暴走が起きているような……とログを見直してみると、起動時に WARNING がでていました。 Sun Jan 20 00:10:01 [initandlisten] MongoDB starting : pid=12669 port=27017 dbpath=/var/lib/mongo 64-b

    MongoDBをNUMAなマシンで使うときの注意 - 酒日記 はてな支店
    oranie
    oranie 2013/02/01
  • fluentdで複数箇所から同一のファイルに出力する - 酒日記 はてな支店

    このエントリは「ウィークリーFluentdユースケースエントリリレー」への参加記事です。 ウィークリーFluentdユースケースエントリリレーまとめ(現在12まで。) - iをgに変えるとorangeになることに気づいたoranieの日記 fluentd で一番手軽な出力 plugin といえば out_file ですね。path を指定するだけでファイルに出力できますが、使い方に気をつけないと落とし穴があるよ、という話です。 簡単な使いかた 一番単純な使いかたはこのような記述で、 <match app.**> type file path /path/to/logs/app.log </match>これで /path/to/logs/app.log にJSON形式で出力されます。 2012-10-27T17:55:00+09:00 app.info {"message":"info m

    fluentdで複数箇所から同一のファイルに出力する - 酒日記 はてな支店
    oranie
    oranie 2012/10/27
  • RedisをKeepalivedでフェイルオーバーする構成案 - 酒日記 はてな支店

    master slave 構成を取っている Redis で、master が落ちた場合に slave を昇格させてフェイルオーバーしたいという要件がありまして、Keepalived と組み合わせて構成してみました。Redis の運用経験がないのでご意見などいただければありがたいです。 Scientific Linux 6.2 keepalived-1.2.2-3 redis-2.4.10 前提 Redis のレプリケーションではマルチマスター構成を取ることができない Redis の slave は起動時に master に接続し、全データを取得してコピーを取る その後は順次 master で更新されたデータをコピーする redis-cli で slaveof コマンドを実行することで、動的に master, slave を切り替えることが可能 このような作りになっているため、2ホスト間で

    RedisをKeepalivedでフェイルオーバーする構成案 - 酒日記 はてな支店
    oranie
    oranie 2012/08/02
  • ロードアベレージを監視して任意のコマンドを実行する(monitで) - 酒日記 はてな支店

    他に似たツールがあれば教えて欲しいです ロードアベレージを監視して任意のコマンドを実行するコマンド - blog.nomadscafe.jp いままで使ったことはなかったのですが、monit でできるはず、と思って実験。一般的には、負荷が上がったりプロセスが応答しなくなったら再起動、のような用途に使うツールです。 # /etc/monit/monitrc check system localhost start program = "/path/to/command" if loadavg (1min) > 2 then start[追記] exec を使うほうがよいとのご指摘をコメントでいただきました。 check system localhost if loadavg (1min) > 2 then exec "/path/to/command"これでロードアベレージの1分平均が2を超

    ロードアベレージを監視して任意のコマンドを実行する(monitで) - 酒日記 はてな支店
    oranie
    oranie 2012/07/26
  • cron で > /dev/null して椅子を投げられないための3つの方法 - 酒日記 はてな支店

    (タイトルは釣りです) いい加減、>/dev/null 2>&1と書くのをやめたらどうか - DQNEO起業日記 この記事のタイトルが twitter で流れてきたのを見て、「そうだ!出力を /dev/null に捨てるなんてとんでもないよね!」と思ってよく読んだら /dev/null に間違いなく捨てる方法だったのでつい crontabに > /dev/null 書いたら椅子投げる 2012-06-13 00:01:17 via YoruFukurou とつぶやいてしまったのですが、では出力を捨てないためにはどうすればいいのか。現時点での個人的ベストプラクティスを書き留めておきます。 デフォルト : メールで送る (MAILTO) せっかく cron daemon がログを捨てないためにわざわざメールで送ってくれるのに、それを > /dev/null で踏みにじるとはひどい。 とはいえ、

    oranie
    oranie 2012/06/13
    ヒィィ
  • 標準入力から読んでFluentdに送信するにはfluent-agent-liteが便利 - 酒日記 はてな支店

    標準入力から受けたログを syslog に送信する場合に使えるのが logger(1) コマンドです。 $ echo "log message" | logger -t myapp -p local0.info自分のところではバッチ処理の出力や、daemontools で起動したコマンドの出力を log/run で logger に渡して syslog に集約するなどしていました。 これを syslog ではなく、Fluentd に送りたい場合にどうするか。 Fluentd 体には fluent-cat というコマンドが同梱されていますが、これは入力に JSON 形式を要求するので単純に代替はできません。 何か適当なワンライナーで wrap する手もありますが…… $ echo "log message" | perl -MJSON -nE 'say JSON::encode_json(

    標準入力から読んでFluentdに送信するにはfluent-agent-liteが便利 - 酒日記 はてな支店
    oranie
    oranie 2012/06/11
  • [fluentd] #Fluentd Casual Talks で「fluentdでWebサイト運用を楽にする」話をしてきました - 酒日記 はてな支店

    id:tagomoris さんにお声がけいただきまして、Fluentd Casual Talks にて「fluentdでWebサイト運用を楽にする」というタイトルで発表させていただきました。 発表資料はこちら 主催者の id:tagomoris さん、会場を提供していただいた DeNA 様、いろいろ準備をしてくださった id:riywo さんはじめ多くの方々、参加してくださった100名以上の皆様、ありがとうございました!楽しかったです。 発表ではここ半年ほど Fluentd を運用して来た経験をお話ししましたが、発表内で触れなかったことで大事(?)なことがありますので以下に補遺をいくつか書いておきます。 MongoDB にログを溜めすぎない方がいいかも 太田さん (@kzk_mover) の発表内でも触れられていましたが、数千万件程度にしておいたほうがいいのでは……という実感です。 発表内

    oranie
    oranie 2012/05/21
  • fluent-plugin-zabbix リリース - 酒日記 はてな支店

    fluentd の出力プラグイン、fluent-plugin-zabbix をリリースしました。 Github fujiwara/fluent-plugin-zabbix https://github.com/fujiwara/fluent-plugin-zabbix fluent-plugin-zabbix | RubyGems.org https://rubygems.org/gems/fluent-plugin-zabbix] 監視とメトリクス収集に Zabbix を使っているので、fluentd で収集した値を zabbix に送って扱いたかったのです。 挙動としては zabbix_sender でホスト側から送信するのと同様です。主に datacounter や flowcounter で集計した値を送るのを想定していますが、送信頻度に気をつければなんでも送れると思います。 作成

    fluent-plugin-zabbix リリース - 酒日記 はてな支店
    oranie
    oranie 2012/04/17
  • 酒日記 はてな支店 - Deamon::Generic で TheSchwartz の worker をデーモン化する(1)

    TheSchwartz の worker をデーモンにしたくて、どうしようかと。daemontools でもいいんだろうけど、CPAN で見つけた Daemon::Generic を使ってみた。 まず TheSchwartz の client (jobを投入する) と worker (jobを実行する) モジュールを普通に作る。 #!/usr/bin/perl # client.pl use strict; use TheSchwartz; use YAML qw/ LoadFile /; my $client = TheSchwartz->new( %{ LoadFile(shift) } ); $client->insert( 'MyWorker' => { t => time } ); package MyWorker; use strict; use base qw/ TheSch

    酒日記 はてな支店 - Deamon::Generic で TheSchwartz の worker をデーモン化する(1)
    oranie
    oranie 2012/04/03
  • Daemon::Generic 2題 - 酒日記 はてな支店

    以下 2点。ちょいと困ったので調べた。 1. Daemon::Generic で書いた daemon を cron から起動するとゾンビが残る件 2. logger 経由で表示されるログの pid が、自分のじゃない件 まず、プロセスを daemon 化する処理について。 Unix Programming Frequently Asked Questions 日語訳 - 1 プロセス制御 / 1.7 プログラムをデーモンとして動かすにはどうすればいいですか?と Daemon::Generic のソースを見比べたら流れが違う。 fork() setsid() fork() STDIN, STDOUT, STDERR を close して open という流れだと理解したんだけど、Daemon::Generic は gd_daemonize() の中で STDOUT, STDERR を cl

    Daemon::Generic 2題 - 酒日記 はてな支店
    oranie
    oranie 2012/04/03