Photo by the_amanda PhotoShareをRailsから、EventMachineベースの自作フレームワークに全面書き換えをしているのですが、大体作り終わりベンチマークを取っていると、概ね1msで処理しているのに、時々、数百ms掛かることがありました。 初めはGCとか疑ったんですが、GC.disable実行しても状況変わらず。絞り込みをしていると、どうもEventMachineで詰まって居るっぽい。 EC2上で動かしていたので、手元のマシンで試したり、LinuxじゃなくてFreeBSDで試しても同じように詰まる。同じEventMachineを使っているThinを使って、ベンチマーク取ってみても、100回に1回ぐらい、やたらレスポンスが遅い時間があるのを確認できました。 ApacheBenchやhttperfは、平均値は取れるけど、個別のレスポンスタイムを出力する方法が見つからなかったので、JMeterに初挑戦。HTTPだけじゃなくて、いろいろなプロトコルに対応しているのがいいね。 色々試してみると、HTTPに限らずTCPソケットサーバを作ると発生するらしく、こんなコードでも、1000回に1,2回、接続した後1000ms近く待たされることがあることが分かりました。 MLとか探しても、同じような現象の話が出てきていない・・・。探し方が悪いのか、じつは誰もあまりまじめに使ってないのか・・・・。 ここら辺まで原因がつかめたところで、takiuchi先生にご相談。 結局カーネルまで追って、変にselectを呼び出して居ることが判明。takiuchi先生さすが! 自分もカーネルとか追うように色々準備しておかないと駄目だなと反省。 このコードを元に検索してみると、迷ったりしていることは分かったけど、このパッチを当てると、接続が詰まる状況が改善。 ここ以外にも、微妙なコードが見られるので、引き続きコードを追ってみよう。 年末の忙しい時期なのに、手伝ってくれてありがとうございました!>takiuchi先生
Yearly Archives:: 2008
Webでの非同期処理を考えてみる [長い記事だけどコメント求む!]
Photo by harry harris いまPhotoShareのサーバの実装を大きく変えようとして悩んでいます。 (参考: Life is beautiful: マルチスレッド・プログラミングの落とし穴、その2) Rails 2.2でThread safeになるとか、NeverBlockで12倍速くなるっていう話もあるんだけど、負荷が上がればレスポンスが悪くなるのは、どうしようもない。マシンを増やせば解決できる部分もあるけど、マシンを増やせばコストは上がる。 Life is beautifulで書かれていますが、確かに全部の処理を同期的に行う必要はないんですよね。 PhotoShareでも、既にいくつかのページは非同期にerbを生成して、それをRailsとerubisで読み込んで実行しています。 しかし、Railsだけではこういった非同期の処理やviewの一部を事前に生成するという処理ができないので、この処理は別途プラグインを作って実現しています。 高速化の為にはキャッシュを使おう Railsで高速化を考えていくと、特にキャッシュが重要になります。たとえばブログエンジンで、RSS Feedを生成するアクションがあったとします。
Javascriptだけでコンテンツの言語を切り替えするスクリプト
Photo by keepps 前回のブラウザの言語をJavascriptから調べるを元に、ページのメッセージを言語切り替えするスクリプトを作ってみました。 実際のページは、これです。 一つのHTMLの中に複数の言語のメッセージを書き、それぞれの言語をCSSのクラスで指定することで、ブラウザに合わせた言語のみが表示されるようになります。 日本語版のブラウザで見ると「こんにちは世界」、英語版やポルトガル語版のブラウザで見ると、それぞれの言語でメッセージが表示されます。 デフォルトの言語は英語に設定しているので、日本語やポルトガル語以外のブラウザで見た場合は、英語のメッセージが表示されます。 このスクリプトでは、JSでブラウザの言語を取得したあと、表示するCSSを切り替えることで、メッセージ切り替えを実現しています。使い方などはページのソースを参考にしてください。 設置する前には、CSSとこのスクリプトはなるべく先頭で実行するようにしてください。あまり下の方で読み込むと画面がちらつく可能性があります。 言語の切り替えするなら、Apacheのcontent negotiationでいいじゃん!ってご意見を複数から頂いたのですが、Railsのpage cacheで使いたい、複数言語のHTMLを作ると修正が面倒なので、1つのHTMLで全部の言語を記述したい、Google翻訳APIとも組み合わせたいなぁ、などの理由で作ってみました。 なお、動作確認は、FF3 (3.0.1), FF2 (2.0.16), IE6 (SP2 6.0.2900), IE7 (7.0.5730), Safari3 (3.1.2), iPhone Safari (OS 2.1), Opera9 (9.27), Google Chrome (0.2.149.30)、Wii ブラウザで取れていますが、Windows MobileのIEやOperaでは動かない事を確認しています。 Window MobileのIEやOperaでJavascriptのデバグの方法をご存じの方は教えていただけますか?
ブラウザの言語をJavascriptから調べる。
Photo by midnightglory 多言語対応のサイトを作っていると問題になるのが、メッセージの切り替えです。PHPやRailsを使っている場合は、HTTP_ACCEPT_LANGUAGEを見てメッセージ生成を切り替えれば良いのですが、静的ファイルの場合は、そうは行きません。 そこで、今回はJavascriptだけでブラウザの言語を取得する方法を調べてみました。 ググっていると、ブラウザ依存ですが取得する方法が見つかったので、各ブラウザで検証した所、navigator.browserLanguage、navigator.language、navigator.userLanguageのいずれかで取得できることが分りました。 ただ、この値はブラウザのデフォルト言語環境のなので、HTTP_ACCEPT_LANGUAGEとは違う値が返ってきます。たとえば、日本語OSに英語版のFirefoxを入れている場合は、”en”が返ります。 それでまとめてみたのが、このbrowserLanguage()です。 実行すると”en”や”ja”などの言語情報が返ってきます。
PhotoShareで新しいiPhoneにデータを移行する方法
Photo by Miss Indi Pop PhotoShareは誰でも簡単に使えることに力点を置いているので、ユーザ登録なしで利用できる、というのを特徴にしています。 しかし、新しいiPhoneを買った場合など、PhotoShareで新しいiPhoneにデータを移行したい場合、通常のサービスであれば、アカウントを入力するのですが、PhotoShareではアカウントがありません。 そこで、PhotoShareでは、登録したメールアドレスによってデータの移行ができる様になっています。 旧iPhone: メールアドレスを登録する (メールアドレスの登録は、トップメニューの「設定」から行えます。 ) 旧iPhone: PhotoShareを削除する 新iPhone: PhotoShareをインストールする 新iPhone: 旧iPhoneと同じメールアドレスを登録する iPod touchからiPhoneに移行する場合は、「旧iPhone」を「iPod touch」に読み替えてください。 これで旧iPhoneから情報が削除されたので、旧iPhoneにPhotoShareをインストールすると、また新しいアカウントとして使うことができます。 PhotoShareでは端末IDを元にしているので、修理などで端末が交換された場合にも、アップした写真などが見えなくなってしまうことがあります。その場合にも、メールアドレスを登録することで前の情報が新しいiPhoneにも引き継がれます。 データの移行には、メールアドレスの登録が必須になりますので、なるべく登録するようにしてもらえると助かります。 旧iPhoneでは、データ移行後、アプリを一度削除すれば、すべての情報は削除されますので、譲渡などを行ってもPhotoShareの情報が渡ることはありません。
EventMachineを使ったクローラの書き方の足がかり
Photo by pnoeric いま、PhotoShareで使うために、高速なEvent Driven方式のネットワークライブラリ、EventMachineを調べています。 このEventMachine、ほとんどの場合はサーバを作るときに使われていますが、HTTPクライアントの機能も実装されており、実はクローラの様な物を作るときにも利用することができます。 今回はこっちを使いたかったのですが、ググってもほとんど情報が出てこなかったので、Seattle.rbで相談したところ、Aaronさん(RubyKaigi 2008でプレゼンしているのをustで見てコンタクトしました)からサンプルが貰えたので、それを元に、同時接続する様にしてみました。 このコードだけだと役には立ちませんが、情報が少なかったので参考に上げておきます。
RailsでMemcachedが落ちていてもエラーにならない方法
Photo by masuidrive76 Railsで高速化するためには、Memcachedによるキャッシュが欠かせないですが、もしmemcachedが落ちてしまうと、サービス全体でエラーが発生してしまうのが、気になるところでした。 Takiuchiさんと話をしていて、fiveruns-memcache-clientを使うことで、memcachedを再起動さえすれば自動で再接続されることはわかったのですが、やはりmemcachedが落ちている時はエラーになってしまうのが問題でした。 どうせ、キャッシュはキャッシュなのだから、memcachedが落ちている間はキャッシュを使わない様にするパッチをmemcache-clientに組み込もうと思って作業をしていたら、実はcache_fuにその機能があるのを発見しました。 config/memcached.ymlで、「raise_errors: false」を指定するだけで、memcachedでエラーが起こった場合には、キャッシュを無視するようになるようです。 ちょっと気になるのは、memcachedが落ちたのではなく、ネットワークなどの障害で一時的に接続されなかった場合、キャッシュの不整合が起こることです。これは、自動再接続したときにflush_allするなどのパッチを別に作る必要があるかもしれません。
iPhoneが起動不能になった場合の復活方法
iPhoneのアプリを色々と入れていると、突然iPhoneが起動しなくなることがあります。 iTunesから認識する場合は、「復元」ボタンを押せばいいのですが、iPhoneが起動せず、認識すらしない場合があります。 その場合は、一度Home+電源長押しで、電源を切った後、USBに接続して、Homeを押しながら電源をいれてください。 このようにすると、下のような画面が出てiTunesがリカバリーモードになってiPhoneを認識するので、iTunesから復元を実行してください。
RailsアプリをチューニングするならNew Relic RPM
Photo by Riverman72 あとで自分メモを書こうと思うけど、先に一言。 37signalsも使っているといううたい文句に惹かれて試してみた、Railsのパフォーマンス記録ツール/サービスNew Relic RPM(Rails Performance Management)が、すばらしい。 RPMは開発時用のDeveloperと、実機用のProductionのが二つあり、まだ開発時用のDeveloperモードしか試してはいないんだけど、専用の管理画面で、アクションを実行時のメソッド単位の実行時間、生成されるSQL、SQLの実行時間やインデックスの利用状況などが非常に簡単に把握できます。 Railsで開発している人なら、下のムービーを見れば、そのすごさが分かるはず。 RPM developerのデモ動画 | RPM production のデモ動画 いまこれを使って、PhotoShareのチューニングをしていますが、非常に快適。これは超おすすめです。 ひととおりチューニングが終わったら、RPM Productionのagentをインストールして実際に稼働しているRailsのデータを元にさらにチューニングを進められるって言うところがまたすごいなぁ。いい連携だ。 しかしこのソフトもすごいけど、Railsもこういった周辺マーケットが育ってきている事実も見逃せないなぁ。 同種のサービスでは、FiveRunsもあるし、単なるホスティングではないサービスを提供する会社が増えてきていることは、Railsが本格的にビジネスに結びついているって事なんだろうな。
BigCanvas PhotoShareリリース!
中島さんと立ち上げた、Big Canvasのファーストプロダクト、Big Canvas PhotoShare (www.bcphotoshare.com)をリリースしました。AppStoreでのダウンロードは、こちらから。 このアプリケーションは、何よりも手軽に写真を使ったコミュニケーションが出来ることを目指したアプリです。 煩雑なユーザ登録などせずに、写真をサーバへアップロードし、友人や家族と共有できます。誰かを指定して写メするのと違い、自分の日常を流していくTwitterのようなユルいコミュニケーションを目指してます。 すでに取った写真をアップロードしたい場合には、右下の四角のアイコンを、その場で写真を撮りたい場合はその隣の、カメラのアイコンをクリックします。写真をアップロードするときには、「非公開」「家族と共有」「友人と共有」「全員に公開」を選んでください。 「友達と共有」とした写真を友達に見せたい場合は、メインメニューを下にずらし、「友人」や「家族」を選択し、「招待する」をクリックします。これで、メールの作成画面に移りますので、そのメールを友達に送りましょう。 招待された人が、iPhoneを持っていない場合は、Webでも写真を見ることができます。 iPhoneのアプリの日本語化はされていますが、まだWeb側の方は英語版のみになっています。Webの日本語版は近日中にリリースします。 また、この週末は過負荷により、サーバとの通信が重い可能性があります。チューニングやサーバ強化は順次行っていきますので、ゆっくり楽しんでください。
