タグ

ブックマーク / blog.nomadscafe.jp (26)

  • 「ISUCONで学ぶ Webアプリケーションのパフォーマンス向上のコツ 実践編 完全版」を公開しました - blog.nomadscafe.jp

    昨日のエントリで紹介した「Webアプリケーションの パフォーマンス向上のコツ 実践編」ですが、いくつかスライドを追加して、「完全版」として公開しました。 ISUCONだけに限らず、一般的なWebアプリケーション、SQLのチューニングの参考となる資料となっていると思いますので、見て頂けたら嬉しいです。 <追記> ISUCON4 オンライン予選の参加登録が開始されています!!!Webアプリケーションを書いている方もインフラを扱っているエンジニアも運用エンジニアも、ぜひチャレンジしてください!!私もでます!! 参加はこちらから↓↓↓↓ ISUCON4 オンライン予選の参加登録を開始しました \n\n\nISUCONだけに限らず、一般的なWebアプリケーション、SQLのチューニングの参考となる資料となっていると思いますので、見て頂けたら嬉しいです。\n\n## <追記>\n\nISUCON4 オン

    sh2
    sh2 2014/08/22
    インデックスの図解が明瞭で分かりやすい
  • 一時ファイルとdentry cacheとメモリ - blog.nomadscafe.jp

    わりと長い間悩んでいたんだけど、最近解決したのでメモ。 サービスで利用しているsmalllightの画像変換サーバが、Apacheが使っているメモリ以上のメモリを使用し、Swapしたりメモリ枯渇でサーバがダウンするなどのことが何度かありました。 ↑メモリの動きはこんな感じ いろいろ調べた結果「dentry cache」なるものがメモリ多くを占めていることがわかりました。dentry cacheはディレクトリやファイル名とinodeとを結びつけに使われるキャッシュです。smalllightでは画像を変換する際に一時ファイルを作成するので、その情報が残るようです。 手元で再現させる 番で使っているサーバはCentOS5系ですが、手元のVagrant上のCentOS6(ファイルシステムはext4)で、再現させてみました。 use Parallel::Prefork; use File::Tem

    sh2
    sh2 2014/01/09
    素人目にはファイルを削除すると同時にdentry cacheが解放されれば良いのにと思うけれど、そうなっていない深遠な理由があるのだろうけど、ちょっと調べたくらいでは分からなかった
  • Vagrantのprovisionerを使ってmroongaのrpmを作る方法 - MySQL Casual Advent Calendar 2013 - blog.nomadscafe.jp

    このエントリーはMySQL Casual Advent Calendar 2013 11日目の記事です。2011年のAdvent CalendarはQ4Mの導入方法を書いたので、今回はmroongaを書きます。 lestrratさんのエントリにもありますが、某サービスの検索システムをmroongaに置き換えるってのを準備しています。今のところメモリ64GB/ioDriveなマシンに、番で想定している倍の量の9000万件/台の記事データをストレージモードで突っ込んでいますが、遅くても0.5秒ぐらいで検索結果が得られるのでなかなか上々です。 mroongaを導入している環境は、CentOS6系でMySQLは5.6系を使っています。MySQLOracle公式rpmです。mroongaの公式サイトで配布しているrpmはOS付属のMySQLのバージョンに合わせたrpmなので、Oracle公式rp

    sh2
    sh2 2013/12/11
    「エキサイティングな変更履歴」
  • G-WANはなぜ速いのか?をnginxと比べながら検証してみた - blog.nomadscafe.jp

    ツチノコブログのWEBサーバベンチマークツール比較の記事で紹介されていた。WebサーバのG-WAN。この記事によると凄く速いようです。 Intel Xeon E5-2640 (6コア/12スレッド 2.50GHz) を2つというサーバで gwan  334944 req/s nginx 111842 req/s と、速いと言われているnginxの3倍の速度を出しています。 このベンチマーク結果がとても気になったので、なぜG-WANが速いのか、自分でも検証してみました。 結論から言うと以下の2つ。 1) G-WANはデフォルトで物理CPUに合わせた数のスレッドを起動する 2) HTMLファイルも一度読み込んでキャッシュする という事です。 今回はAWSのcc2.8xlarge(E5-2670 8コア/16スレッド 2.60GHz *2)を使ってベンチマークを行いました。OSはAmazon L

    sh2
    sh2 2013/09/04
    チューニングすごい
  • この一年のブログエントリまとめ - 2012年編 - blog.nomadscafe.jp

    この一年まとめも3回目になった。去年はここ 今年は1/1の会社統合によって所属がNHN Japanに変わってオフィスが新宿=>大崎=>渋谷と流浪しましたが、仕事は変わらずやってます。その成果の一つがこれ 1年でPVが2倍に伸びました。ライブドアブログの主なニュースまとめ2012年版 もちろん良いブログ、良い記事に恵まれ、ソーシャル系サービスの波にうまく乗ったがことが大きな要因だとは思いますが、サーバ側でも逐次アプリケーションやSQLの改善をしたり、インフラの増強等をしてこれたのも良かったのではないかと自負しています。 GrowthForecast GrowthForecastを公開したのは去年の年末でした。弊社でも様々な指標のグラフ化に利用していますし、他社でも多くの方が使って頂いているようです。 GrowthForecastというグラフ表示ツールで捗る話 GrowthForecast を

    sh2
    sh2 2013/01/02
    一年分のアウトプットでこの質と量はすごいなあ
  • isucon2 を開催しました。あるいは、優勝組の5倍のスコアを出す方法 - blog.nomadscafe.jp

    去年の第一回では、次の日に3時間の昼寝をしていたようですが、今年は開催中に体調を崩してしまい、参加者の皆様がハックをしている最中にクッションで横になっているという状態になってしました。セットアップの不手際と合わせて申し訳ないと思っています。また家の事情的なこともあり、準備段階であまり協力できなかった中、ibuchoさん、941さん、やぶたさん、tagomoris、sugyanには感謝しております。そして参加者、協力して下さった方みなさまに感謝しております livedoor Techブログ : #isucon2 リアルタイムフォトレポート 更新終了 livedoor Techブログ : #isucon2 参加者・関連エントリまとめ tagomoris/isucon2 - GitHub ISUCON2では課題となったチケット販売サイトのアプリケーションの作成はsugyanが行い、ベンチマークツ

    sh2
    sh2 2012/11/06
    PerlもMySQLもなくなってしまって、Webアプリケーションの定義とはというところまで戻って考えさせられるレベル。incrで代用できるのは購入後のキャンセルがないからかな
  • MySQLの設定ファイル my.cnf をgithubにて公開しました & チューニングポイントの紹介 - blog.nomadscafe.jp

    YAPC::Asiaのスライドで予告していた通り、実際に弊社のいくつかのサービスで使っている my.cnf を公開しました。 github: https://github.com/kazeburo/mysetup/tree/master/mysql 今回、公開した理由はMySQl Beginners Talksの発表の中でも触れている通りです。MySQLのソースコード中に含まれるサンプルのmy.cnfが最近のサーバハードウェアや運用に合わなくなって来ているという状況で、自分の設定にイマイチ自信が持てていない人は少なくないはず。そこで各社秘伝のタレ的な my.cnf をOpen & Shareすることで、モダンなmy.cnfを作り上げる事ができるんじゃないかという考えの下、今回 github にて公開しました。 ファイルは4つあり、それぞれ MySQL 4.0、5.1、5.5、そしてテスト中

    sh2
    sh2 2012/10/05
    server_idをIPアドレスから自動生成している
  • cron等をつかって外部のAPIに問い合わせる場合は、毎時0分を避けるのが大人のマナー - blog.nomadscafe.jp

    なんかtwitterで書いたらウケたっぽいので cronをつかって外部のAPIに問い合わせる場合は、毎時0分をさけるのオススメ!!!!お兄さんとの約束だ!!! — masahiro nagano (@kazeburo) August 9, 2012 某サービスのAPIへの問い合わせ件数を調べると、毎時 0分台(0秒から59秒)のアクセスは1分から59分までの1分間の平均アクセス数の5倍から8倍にもなります。 これはおそらく、crontabの設定が 0 * * * * /path/to/call_foreign_api になっていることが多いからじゃないかなぁと思うのです。 その結果、サーバのロードアベレージは このように毎時0分だけ跳ね上がってしまいます。サービスを快適に提供できなくなる可能性があるので、APIの利用を制限したり、サーバを追加しなければなりません。これはサービス利用者、サー

    sh2
    sh2 2012/08/10
    cron側で実行時刻を散らすjitterというオプションがあるそうだけど、RHEL 5/6にはなかった。RHEL 6からデイリー以上のジョブはanacronがランダムで最大45分の遅延を入れるらしい http://aikotobaha.blogspot.jp/2011/02/rhel6-7cronanacron.html
  • CentOS 6.2 で RPS/RFS を使ってネットワークの割り込み処理を複数コアに分散してみた - blog.nomadscafe.jp

    以前(2010年)に「アプリケーションがマルチスレッドでもマルチコアCPUを活かせない件」というエントリにてCPUのコアが増えても割り込み処理が分散されないのでスケールされないと書いたけど、その後Linux KernelにRPS/RFSなる機能が追加され、割り込み処理が分散できるようになり、CentOS 6.2 でも使えるらしいので試してみました。 RPS/RFSについての紹介は VIOPS06で「RPS・RFS等最新Linux Kernel事例」と題してお話してきました http://d.hatena.ne.jp/syuu1228/20110722/1311322653 Linux内核 RPS/RFS功能详细测试分析 http://www.igigo.net/archives/204 が詳しい。2番目のはほぼ読めないけど、性能比較のグラフが分かりやすい。 今回試したサーバは、 OS: C

    sh2
    sh2 2012/08/09
    今はRSS対応していないNICを選んでしまっても大丈夫なのか。すばらしい
  • Intel SSD 910 800GB のベンチマーク - blog.nomadscafe.jp

    PCIeに接続するタイプのSSD、Intel SSD 910 800GBを借りる事ができたのでベンチマーク結果置いておきますね サーバは Intel Xeon L5630 を2つ積んで、HTが有効なので16コアに見えます。ベンチマークは namikawa氏の「噂の高速SSDを積んだAmazon EC2インスタンスのI/Oベンチマークをとってみた」とほぼ同じ条件で取ってみました。 OSは CentOS 6.3 です。 Intel SSD 910 800GBは200GBのデバイスが4つに見えます。dmesgで以下のように表示されています。 scsi 1:0:0:0: Direct-Access INTEL(R) SSD 910 200GB a40D PQ: 0 ANSI: 6 scsi 1:0:0:0: SSP: handle(0x0009), sas_addr(0x5000cca013005

    sh2
    sh2 2012/07/27
    hi1.4xlargeと性能特性がよく似ているなあ。ランダム書き込みがやや遅い
  • ロードアベレージを監視して任意のコマンドを実行するコマンド - blog.nomadscafe.jp

    とあるサーバでロードアベレージが上がったときに何が起きているか知りたくなったので書いてみました。他に似たツールがあれば教えて欲しいです cpan: https://metacpan.org/release/App-LoadWatcher github: https://github.com/kazeburo/App-LoadWatcher インストール インストールはcpanmを使います $ cpanm App::LoadWatcher cpanmが入っていないなら $ curl -L http://cpanmin.us/ | perl - App::LoadWatcher とすると楽です 使い方 ロードアベレージが「0.6」以上のときにuptimeを表示するには $ load_watcher -l 0.6 -- uptime こんな感じです。ハイフン2つ書いたあとにコマンドを書きます オ

    sh2
    sh2 2012/07/26
    ロードアベレージ以外のトリガも追加定義できると捗る気がしたけど特に思いつかなかった
  • MySQL で SELECT COUNT(DISTINCT) VS SELECT COUNT(*) FROM (SELECT .. GROUP BY ..) AS t - blog.nomadscafe.jp

    とあるMySQLのslowlogに残っていたところから見つけたクエリの書き換え。 サービスのどこで使われているものかまで詳しくみていないんだけど CREATE TABLE `category2item` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `category_id` int(10) unsigned NOT NULL, `subcategory_id` int(10) unsigned NOT NULL, `item_id` int(10) unsigned NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `subcategory_id` (`subcategory_id`,`item_id`), KEY `picture_id` (`item_id`), KEY `category_id` (

    sh2
    sh2 2012/04/10
    適当に作ったテストデータだとほとんど変わらなかった。あとで検討
  • Apache httpd.conf の Allow from .. にコメントを書いてしまうとDNSの逆引きが行われてレスポンスが悪化するので注意の件 + コメントが書けるようになるパッチ - blog.nomadscafe.jp

    Apacheのconfにコメントを書く際に、設定の後ろに書く事はできないのは知られているのかどうかよくわかりませんが、その通りです。例えば MaxRequestsPerChild 200 #少なめに これは syntax error になります % ./local/httpd/bin/apachectl -t Syntax error on line 12 of /Users/.../local/httpd/conf/httpd.conf: MaxRequestsPerChild takes one argument, Maximum number of requests a particular child serves before dying. よくやりがちなんですが、ドキュメントにも Directives in the configuration files are case-in

    sh2
    sh2 2012/04/04
    シンタックスエラーにする案は本家に提案したら通りそうな気もするなあ
  • Replication Booster for MySQL を試す - blog.nomadscafe.jp

    松信さんが作った Replication Booster for MySQL をデータサイズが大きいデータベースに対して使ってみました。 Yoshinori Matsunobu’s blog: Making slave pre-fetching work better with SSD github - yoshinorim/replication-booster-for-mysql Replication Booster for MySQL をものすごく簡単に説明すると、以下のようになるでしょうか。 MySQL でレプリケーションを設定した場合、マスターのバイナリログをIOスレッドが読み取り、relay-logへ記録します。そしてSQLスレッドがrelay-logから読み取ってテーブルを更新して行きます。Replication Booster を実行するとrelay-logを読み取り、更

    sh2
    sh2 2012/03/23
    -tオプションのスレッド数に応じてIOPSが伸びる、そこそこ優秀なストレージが必要な気がする
  • ImageMagickとOpenMPの件 - blog.nomadscafe.jp

    PerlMagick が OpenMP 有効だと高負荷になる件 :: drk7jp」の件 どうやら、Perlに限らずマルチプロセスでOpenMPが有効なImageMagickを動かすとパフォーマンスが悪くなるようです。 Enabling OpenMP for most algorithms creates 8 threads (1 per core). If your process creates 8 threads that’s a total of 64 threads and that is a whole lot of contention and possible misuse of your processor cache. 「ImageMagick • View topic - Multi Process Contention?」より ということで、small_light

    sh2
    sh2 2011/12/30
    技術的な背景が気になる
  • レプリケーション作成を簡単にする mysql40dump という mysqldump の wrapper を作った話 - blog.nomadscafe.jp

    みなさん mysqldump は好きですか? 自分はどっちでもありません。 MySQLでよくあるMaster-Slave構成を作る手順は以下のようになると思います MasterからSlaveとなるサーバに一貫性を保った状態のコピーをし、そのデータのバイナリログのファイル・ポジションをメモ。 SLAVEでデータをリストアし、Masterのホスト名、レプリケーションに使うユーザ名・パスワードとメモしたバイナリログのポジションをCHANGE MASTER文に渡し、START SLAVE 一貫性の取れたコピーを作成するためにmysqldumpやxtrabackup、LVMなどでのスナップショットが利用できますが、もっとも簡単な方法がmysqldumpだと思います。 mysqldumpで一貫性のあるデータをとり、その際のバイナリログポジションを記録するには $ mysqldump --single-

    sh2
    sh2 2011/12/22
    MySQL 5.5のmysqldumpで4.0から吸い出してはどうかと思ったのですが、4.1.3未満のmysqldにsingle-transactionとmaster-dataの組み合わせでbinlogの位置を正確に取れないバグがあるそうです。その後のレビュー結果 http://togetter.com/li/231175
  • チート対策とhttp_loadに仕掛けた罠の話 #isucon - blog.nomadscafe.jp

    完全に文化祭疲れで昼寝3時間ぐらいしてしまいましたが、懇親会で聞かせて頂いた話やblogやtwitterをみる限り好評だったようで、うれしく思っています。ISUCONに参加して頂いた方、社内で協力して頂いた方ありがとうございました いくつか至らぬ点がありますが、明日以降に公式にフォローさせて頂きたいと思っています。 さて、既に公開されているので見た方は多いと思いますが、今回ISUCONで使ったベンチマークツールは大きく分けて次の3つのツールに分かれています。 (1) 1post/secでコメントを投稿し、1秒後にコメントをしたページと、インデックスおよび適当な記事のDOMチェックを行う node.js (2) http_load + patch (3) css/js/imageのMD5値を検証する perl script 最終的な順位はhttp_loadが行ったリクエスト数で決まるのでもし

    sh2
    sh2 2011/08/29
    コメントのPOST処理にsleepを差し込んで応答を遅延させて、memcachedのヒット率を上げるとかできるかなあ。bench.jsには1分間に60回POSTしないといけないという縛りはなさそうに見えた
  • memcached-1.4.7-rc1でmixiの大規模障害の原因となったmemcachedの不具合が全て解消されました - blog.nomadscafe.jp

    こちらとこちらのエントリーの続き memcached 1.4.6でmixiの障害の原因となったaccept_new_connsがスレッドセーフじゃない件は修正されているはずだったのですが、検証したところ別のスレッド競合による不具合が発生し、Bugは全て解消されてはいませんでした。 この件についてmixiたんぽぽGの森さんと調査していたところ、memcachedのcommiterにtwitter上で補足され、つたない英語で報告をあげていたら1.4.7-rc1で修正されたのでその報告。 memcached 1.4.6での不具合再現方法 まず、1.4.6で不具合を再現させる方法について。mixiのエンジニアブログと同じように、memcachedは次のオプションで起動し、 $ ./memcached -U 0 -u nobody -p 11222 -t 4 -m 16000 -C -c 1000

    sh2
    sh2 2011/08/14
    すごい
  • Covering Index と self-join と MySQL - blog.nomadscafe.jp

    某サービスのクエリチューニングのお話。 ブログとか日記とかそういうサービス系で次のようなテーブルがあったとします。 CREATE TABLE entries ( id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, user_id INT UNSIGNED NOT NULL, posted_by TINYINT UNSIGNED NOT NULL, --#PC、mobileなどどこから投稿されたかのフラグ title VARCHAR(512) NOT NULL, body TEXT NOT NULL, created_at DATETIME NOT NULL, updated_at TIMESTAMP NOT NULL, status TINYINT UNSIGNED NOT NULL, INDEX (user_id,created_at

    sh2
    sh2 2011/08/14
    自信ないけどFORCE INDEX (user_id)って効かないでしょうか。あと4.1以上ならSELECT COUNT(*) FROM (SELECT posted_by … WHERE created_at BETWEEN …) e WHERE posted_by = 2
  • memcachedのincr/decrがスレッドセーフじゃない件がmemcached-1.4.6で修正されたにょ - blog.nomadscafe.jp

    以前、ここに書いていた、memcachedのincrがスレッドセーフではなく、番号がズレることがある件が 1.4.6 で修正されたようなので検証してみた。 memcached-1.4.6のダウンロードは、memcached.org から リリースノート http://code.google.com/p/memcached/wiki/ReleaseNotes146 検証に使うscriptは以下。 use Cache::Memcached::Fast; use Parallel::ForkManager; my $i=0; while(1) { $i++; my $memcached = Cache::Memcached::Fast->new({ servers => [ { address => "localhost:11211", noreply => 0 } ] , compress_t

    sh2
    sh2 2011/07/22
    めでたいにょ