2013年11月

top コマンドの結果をファイルに吐き出す

メモ。ふつうに

$ top | grep ruby > foo.txt

とやってもファイルに書き込まれない。top の結果をファイルに書き出す場合は -b (batch) オプションと -n (num) オプションを使う。

$ top -b -n 1 | grep ruby > foo.txt
$ cat foo.txt
47395 sonots      20   0  315m  19m  828 R 99.8  0.1  49:05.10 ruby
47358 sonots      20   0  309m  16m 1504 S  0.0  0.1   0:00.75 ruby   

なお、なぜ ps auxww ではなく top を使いたいのかというと、top は一定期間での統計情報を取るが、ps はそのプロセスのライフタイムでの統計情報となるため、最近の CPU 使用率が top でみると 99.8% であるのに、ps auxww だと 5% 程度しか出ていない、というようなことが起きるからである。詳細は Top and ps not showing the same cpu result - Unix & Linux Stack Exchange がわかりやすかった。

最終的には次のようなスクリプトを作成して、指定プロセスのCPU使用率のログを取れるようになった。47395 は指定プロセスのPID。

#!/bin/sh
while true
do
  file="/tmp/watch_fluentd.$(date '+%Y%m%d')"
  date=$(date '+%Y%m%d %H:%M:%S')
  top=$(echo -n $(top -b -n 1 -c -d 0 -p 47395 | awk '$1 == 47395'))
  echo "${date} ${top}" >> $file
  sleep 1
done 
次のようなかんじのログが毎秒取得される
20131125 15:14:19 47395 sonots 20 0 315m 19m 788 R 99.9 0.1 62:22.66 ruby

追記: vmstat 1 で良い気がする

ISUCON本戦さぼってRubyConf2013 at Miami Beach に行って来た

2013/11/09(土) は ISUCON3 本戦でしたね! @tagomoris さん、@kazeburo さん、@sugyan さん優勝おめでとうございます!

さて、自分はというとチーム Miami として ISUCON 予選を通過しておきながら、 RubyConf 2013 に参加するためフロリダ州マイアミビーチに行ってきました。 すみませんすみません><

ちなみに旅費は会社に出してもらいました。DeNA++IMG_0767.JPG
マイアミビーチの風景

初日移動日


成田 → Atlanta → Miami の乗り継ぎでした。午後に出て現地の夜到着でしたね。ぼっちかと思ったら Makimoto さんが同じ便だったので飯屋で合流しました(正確に言うとたまたま同じ飯屋にいました)。

Makimoto さんとも Atlanta → Miami の便が違っていたので、Atlanta でお別れして、現地に付いたら Taxi でホテルまで行って、夕飯情報を求めましたが、皆さんもうすでに夕飯に出かけてしまったようだったので、その辺のスーパーで夕飯買って寝ました。ぼっち。


IMG_0648.JPG
成田で昼食

IMG_0650.JPG

IMG_0658.JPG
カンファレンス会場のホテルを会社に取ってもらいました。ありがとうございます!DeNA++

RubyConf 1日目

1日目!ちょっと早めに行って Registration してブラブラ。知り合いに声かけたり、はじめまして、したり。ホテルの2階が会場なのでエレベーターで移動するだけでした。楽チン。

IMG_0666.JPG

IMG_0679.JPG
名札

IMG_0667.JPG
エスプレッソマシーンとかあって無限コーヒーでした。お水も無限でした。

あと、RubyConf Tシャツとか Code Climate Tシャツとかもらったり

Opening & Keynote - Matz

はじまりました!パチパチ!
IMG_0671.JPG
IMG_0677.JPG
Matzのkeynoteについては@hokkai7goさんがるびまに記事を書くらしいので、そちらを読むと良いと思います!

LT申し込み

Keynote が終わって最初のセッションを聞いている途中で 「LT の申し込みボードが出てたよ」との情報を twitter で得たのでちょっとセッション抜けて LT 申し込みしてきました。資料は飛行機の中で作った。
IMG_0678.JPG
現地早いもの順。ボードに直接ペンで書くので消せない!後戻りできない!

ランチ

会場からランチボックスが提供されてました。けっこう量多い。3日間同じ感じだったので写真は1枚だけ
IMG_0714.JPG
IMG_0715.JPG


あとはてきとうにセッションのメモとか写真とかを貼っておこうかと思います。

RubyConf 1日目

Mastering Elasticsearch With Ruby - Luca Bonmassar

ElasticSearch 使ったみた的なセッションでした。

Under the influence - Zachary Scott

zzak のセッションですね。写真はザクを来た zzak ですね。
slash と perl と ruby の構文比較してましたね。
BYu_VtkCcAA9lud.jpg


Profiling Ruby: Finding 10x Gains In RSpec and CRuby- Xaiver Shay

  1. Hypotheize
  2. Isolate
  3. Instrument

の3つのステップが大事だよ、という話でした。すごいプロファイラ作ったぜ!という話ではなかったですね。


Object management on Ruby 2.1 - Koichi Sasada

IMG_0684.JPG

笹田先生のGC talk ですね。資料はこちら Object Management on Ruby 2.0 (18:40: 永続リンク先に修正しました)。ノロケてましたね。

Dinner

この日は @shyouhei 氏、@igaiga555 氏、@makimoto 氏、@hokkai7go 氏と Umami Burger なんぞを食べたりしました。サンフランシスコのお店かと思っていたらチェーン店だったとは知らなかった。
IMG_0709.JPG
IMG_0710.JPG
続きを読む

RubyのLoggerがプロセスセーフになった件

RubyのLoggerはスレッドセーフ(&プロセスセーフ)かどうか調べてみたの記事の続編です。

結論から言うと、RubyのLoggerはプロセスセーフになります!

対象のプルリクはこちらで Inter-process locking for log rotation by sonots · Pull Request #428 · ruby/ruby 、無事にマージされて ruby 2.1.0 として 2013/12/25 にリリースされます!

これで Fluentd v11 とか Unicorn とかといったマルチプロセスなアプリでも Ruby Logger のログローテーションを安全に使えますね。Ruby 2.1.0 のリリースを待てない方は gem も作っておいたので、必要であればそちらを使ってください!→ https://github.com/sonots/process_safe_logger

裏話

元々は Fluentd (正確には ServerEngine) の 
Issue として @frsyuki 氏と議論、対応していたものです。それを、

という流れで、Ruby にプルリクを送ったものになります。該当 pull request では、@nalsh 氏にレビューおよびアドバイスをしていただきました。ありがとうございました。

あとは最後に、今来ている RubyConf 2013 at Miami で今回のネタを元に LT してきた資料をおいておきますね。

Is ruby logger thread(process)-safe? at RubyConf 2013 from Naotoshi Seo

ということでマルチプロセス環境でも使えるようになりましたのでご活用ください!それでは @sonots でした! 
A Ruby and Fluentd committer working at DeNA. 記事本文および記事中のコード片は引用および特記あるものを除いてすべて修正BSDライセンスとします。 #ruby #fluentd #growthforecast #haikanko #yohoushi #specinfra #serverspec #focuslight
はてぶ人気エントリー