How to increase ulimit on #Gentoo ?

追記

Gentoo忘年会ー勉強会 2014-12-20 - connpassGentoo Advent Calendar 2014 - Qiitaの存在を知りましたのでお酒を呑みながら慎重に検討した結果この記事は21日目に再配置されました。 ときにはそういうことも必要だと思います!

20日目は@aliceinwireさんでした。 22日目は@kizononnさんです。

追記ここまで


Linuxサーバーを運用していると"Too many open files"に出くわし"ulimit 反映されない"でググって Linux サーバでの「Too many open files」対策について - akishin999の日記ulimitが効かない不安を無くす設定 | 外道父の匠 のお世話になるのはままある話。

Gentooの場合、起動スクリプトで起動するプロセス(いわゆるdaemon)であれば簡単にulimitを設定できる。


たとえばRedmineをdaemon化するこんな起動スクリプトを書いたとして、

[root@redmine-host] # cat /etc/init.d/redmine
#!/sbin/runscript
# Copyright 1999-2014 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header: $

description="Redmine daemon"

REDMINE_ENVIRONMENT="${REDMINE_ENVIRONMENT:-production}"
REDMINE_USER="${REDMINE_USER:-redmine}"
REDMINE_GROUP="${REDMINE_GROUP:-redmine}"
REDMINE_NAME="${SVCNAME##*.}"
if [ -n "${REDMINE_NAME}" -a "${SVCNAME}" != "redmine" ]; then
  description="${description} for ${REDMINE_NAME}"
  REDMINE_PID_FILE="/var/run/redmine.${REDMINE_NAME}.pid"
  REDMINE_RB_DEFAULT="/etc/redmine/${REDMINE_NAME}.rb"
else
  REDMINE_PID_FILE="/var/run/redmine.pid"
  REDMINE_RB_DEFAULT="/etc/redmine/unicorn.rb"
fi
REDMINE_DIR="${REDMINE_DIR:-/var/lib/redmine}"
REDMINE_RB="${REDMINE_RB:-${REDMINE_RB_DEFAULT}}"
REDMINE_WORKER_PROCESSES="${REDMINE_WORKER_PROCESSES:-4}"
REDMINE_BUNDLE_EXEC="${REDMINE_BUNDLE_EXEC:-/usr/local/bin/bundle}"
LD_PRELOAD_OPTS=""
if [ -f "/usr/lib64/libjemalloc.so" ]; then
  LD_PRELOAD_OPTS="/usr/lib64/libjemalloc.so"
fi

depend() {
  need net
}

start() {
  ebegin "Starting ${SVCNAME}"
  start-stop-daemon \
    --start \
    --chdir "${REDMINE_DIR}" \
    --user "${REDMINE_USER}" \
    --background \
    --make-pidfile --pidfile "${REDMINE_PID_FILE}" \
    --env PATH="${PATH}:$(dirname ${REDMINE_BUNDLE_EXEC})" \
    --env LD_PRELOAD="${LD_PRELOAD_OPTS}" \
    --env REDMINE_PID_FILE="${REDMINE_PID_FILE}" \
    --exec "${REDMINE_BUNDLE_EXEC}" \
    -- exec unicorn_rails -c "${REDMINE_RB}" -E "${REDMINE_ENVIRONMENT}"
  eend $?
}

stop() {
  ebegin "Stopping ${SVCNAME}"
  start-stop-daemon --stop --pidfile "${REDMINE_PID_FILE}"
  eend $?
}

/etc/conf.d/SVCNAMErc_ulimitを書いておくと反映してくれる。

[root@redmine-host] # cat /etc/conf.d/redmine
rc_ulimit="-n 65535"
rc_need="nginx"

REDMINE_DIR="/var/lib/redmine/versions/current"
REDMINE_BUNDLE_EXEC="/usr/local/bin/bundle"
REDMINE_RB="/var/lib/redmine/versions/current/config/unicorn.rb"

便利!

[root@redmine-host] # cat /proc/$(cat /var/run/redmine.pid)/limits
Limit                     Soft Limit           Hard Limit           Units     
Max cpu time              unlimited            unlimited            seconds   
Max file size             unlimited            unlimited            bytes     
Max data size             unlimited            unlimited            bytes     
Max stack size            8388608              unlimited            bytes     
Max core file size        0                    unlimited            bytes     
Max resident set          unlimited            unlimited            bytes     
Max processes             3981                 3981                 processes 
Max open files            65535                65535                files     
Max locked memory         65536                65536                bytes     
Max address space         unlimited            unlimited            bytes     
Max file locks            unlimited            unlimited            locks     
Max pending signals       3981                 3981                 signals   
Max msgqueue size         819200               819200               bytes     
Max nice priority         0                    0                    
Max realtime priority     0                    0                    
Max realtime timeout      unlimited            unlimited            us        

ちなみにcomment outすると

[root@redmine-host] # grep rc_ulimit /etc/conf.d/redmine
#rc_ulimit="-n 65535"

こんな感じ。

[root@redmine-host] # cat /proc/$(cat /var/run/redmine.pid)/limits
Limit                     Soft Limit           Hard Limit           Units     
Max cpu time              unlimited            unlimited            seconds   
Max file size             unlimited            unlimited            bytes     
Max data size             unlimited            unlimited            bytes     
Max stack size            8388608              unlimited            bytes     
Max core file size        0                    unlimited            bytes     
Max resident set          unlimited            unlimited            bytes     
Max processes             3981                 3981                 processes 
Max open files            1024                 4096                 files     
Max locked memory         65536                65536                bytes     
Max address space         unlimited            unlimited            bytes     
Max file locks            unlimited            unlimited            locks     
Max pending signals       3981                 3981                 signals   
Max msgqueue size         819200               819200               bytes     
Max nice priority         0                    0                    
Max realtime priority     0                    0                    
Max realtime timeout      unlimited            unlimited            us        

Tried the Mount Engine

id:onk さんのMount Engineの記事読んだら便利そうだったのでやってみた。

Railsプロジェクトの作成

まずおもむろにGitHubリポジトリをつくり

  • rbenv local
  • bundle install --path=vendor/bundle
  • bundle exec rails new .

等の儀式を済ませる。 差分は下記の通り。

[diff]Create a Rails project

welcome controllerというHello World的なControllerとViewを作る

[diff]Create a Rails controller
[diff]Create a Rails view

bundle exec rake routesの結果はこんな感じ

[mazgi@Balmung] $ bundle exec rake routes
Prefix Verb URI Pattern Controller#Action
  root GET  /           welcome#index

Welcome!と表示された。

f:id:mazgi:20141218081321p:plain

Mount Engineを試す

記事を参考にconfig/routes.rb

mount proc {|env| [200, {}, ["Hello from mounted engine!"]] }, at: "hello_mount_engine"

の1行を書き加えてみる。

[diff]Add mount to routes

routeが増えた。

[mazgi@Balmung] $ bundle exec rake routes
Prefix Verb URI Pattern         Controller#Action
  root GET  /                   welcome#index
            /hello_mount_engine #<Proc:0x007f138f7872c0@/home/mazgi/Creations/MountableEngineTestDrive/config/routes.rb:4>

/hello_mount_engineというpathでちゃんと表示された。

f:id:mazgi:20141218082001p:plain

Sinatraアプリをマウントしてみる

まずとても簡単なSinatraアプリを作る。 内容はこれだけ:

[mazgi@Balmung] $ < lib/sinatra_app/app.rb
require 'sinatra/base'

class HelloFromSinatra < Sinatra::Base
  set :bind, '0.0.0.0'

  get "/" do
    "I am Sinatra!"
  end

  get "/hello" do
    "Hello from Sinatra!"
  end

  run! if app_file == $0
end

[diff]Create a Sinatra App

まずは単体でbundle exec ruby lib/sinatra_app/app.rb -e productionする。 '/'と'/hello'はそれぞれ次のように表示される。

f:id:mazgi:20141218082749p:plain

f:id:mazgi:20141218082659p:plain

ではいよいよSinatraアプリをRailsアプリにマウントしてみる。

まずconfig/application.rb

require Rails.root.join("lib/sinatra_app/app")

の1行を追加し、次にconfig/routes.rbにSinatraアプリをmountする。

mount HelloFromSinatra, at: "hello_sinatra"

[diff]Add mount for Sinatra app to routes

bundle exec rake routesの出力が増えている。

[mazgi@Balmung] $ bundle exec rake routes
            Prefix Verb URI Pattern         Controller#Action
              root GET  /                   welcome#index
                        /hello_mount_engine #<Proc:0x007fb0335f85a8@/home/mazgi/Creations/MountableEngineTestDrive/config/routes.rb:4>
hello_from_sinatra      /hello_sinatra      HelloFromSinatra

簡単にRailsアプリからSinatraアプリを呼び出せた。

f:id:mazgi:20141218083748p:plain

f:id:mazgi:20141218083801p:plain

Mount Engine便利っぽいしドリコム Advent Calendar 2014勉強になる。

moved my blog

I moved my blog to blog.mazgi.net from self hosted WordPress site.
WordPress is good product, but I was tired of updating wordpress and plugins.

ブログ移行しました。
WordPressの運用に疲れたので。

旧サイトからは↓みたいにリダイレクトしておいた。

location = / {
  rewrite ^(.*)$ http://blog.mazgi.net$1 permanent;
}
location ~* ^/\d+/\d+/.*/$ {
  rewrite ^/(\d+)/(\d+)/(.*)/$ http://blog.mazgi.net/entry/$3 permanent;
  rewrite_log on;
}

submitted #Keymotion App as a control Keynote by #LeapMotion to #Airspace

Previously, I were introduced to the program that can be control Keynote by LeapMotion(blog in Japanese), but was submitted to the Airspace in the App!

What's App?

By the swipe on the LeapMotion, you can control the Keynote.

#LeapMotion Keynote slideshow using Leap Motion from Hidenori MATSUKI on Vimeo.

Story

Last year, I received a Leap Motion Controller that was pre-order! I had made the program for oneself, but I decided to publish because there was a demand on Twitter.

@vassko Thank you very much for giving me this opportunity!

Usage & System Requirements

System Requirements

It has been confirmed in the following two environments: It doesn't correspond to the PowerPoint and Windows.

  • MacOSX 10.9+Keynote 6.2
  • MacOSX 10.8+Keynote 5.3

Usage

Start & Stop

Please make sure "Allow Background Apps" is On in your "Leap Motion Control Panel".

f:id:mazgi:20141210072955p:plain

Item called "KM" in the menu bar will appear when you start the app.

f:id:mazgi:20141210073018p:plain

f:id:mazgi:20141210073041p:plain

Click the "Quit Keymotion" in the "KM" when you end.

f:id:mazgi:20141210073050p:plain

Control slideshow

You can control the Keynote slideshow.

First, Open a single Keynote slideshow. Next, Operations are as follows:

Swipe Up
Start slideshow
Swipe to the Right
Show next slide
Swipe to the Left
Show previous slide
Swipe Down
Stop slideshow

I want to be able to customise the combination of the operation and thresholds of gesture in the future.

As long as us to cooperate in the beta test, please contact the blog comment or Twitter.

#さくらの夕べ とマサカリと #Gentoo LXCと #Fluentd

昨日2/19に新宿で行われた第14回さくらの夕べに参加させていただきました。 LTをさせていただいたので資料を置いておきます。

「さすがは"さくらの夕べ"参加者の方々!」という感じなんですが、さくらインターネット様のサービスと組み合わせてFluentdを実運用されている方も多く、懇親会ではビール片手に色々とお話を聴かせていただいてとても参考になりました。 そんな懇親の場で話題にのぼることが多かったFluetndプラグインですが、取り急ぎ今回使用させていただいたものを羅列しておきます。時間に余裕があれば具体的な手順とか設定例とか盛り込みたかったです。

Fluentd plugins

そしてとても参考になるFluentdの公式ガイドはこちらです: "Splunkのフリーな代替としてFluentdを使う" いやー、偶然たまたまLT直前に日本語版がアップされてよかったですっ

なお、あわせて読みたいさくらのナレッジはこちらです: "柔軟なログ収集を可能にする「fluentd」入門"

あ、ちなみにGentoo Linuxのホストはkernel 3.10.25-aufs + LXCで構成してます!(これはあまり…ほとんど聞かれませんでしたけどっ)

メインセッション

メインセッションではさくらインターネットでネットワークをご担当されてる方がDoSアタック対応のお話をしてくださいました。 レイヤー的にあまり知らない部分の話ですごく興味深かったです。単語をググりながら正座して聴いてました! sFlowとかNetFlowとか普段触る機会がないのでちょっと触ってみたいですね。 セッションではなんと今まさに開発中だというWebコンソールを使ったデモまで見せていただきました。さくらの夕べin石狩のときにも何やら開発中のものをみせていただいた記憶がありますが、本当にオープンでありがたいです! 結構裏話的なトークもあり、テーマからは意外なほど笑いが起こるセッションでした。 えっと、「さくらインターネットのサービスはDoS耐性相当高いですよ」というお話でした!

なお、あわせて読みたいさくらのナレッジはこちらです: "ふたひねりきかせたOpenFlowの利用事例" OpenFlowってもっと違うイメージを持っていました。

で、じつはメインセッションでは弊社からも事業やAnsibleによるサーバー構築の話をさせていただきました! 私自身がそうだったのですが、やはりアドテクは通常目に見えない部分が多く、イメージを浮かべづらい部分があるかもしれません。 今回のような機会に興味を持っていただけましたら幸いです。ミドルウェアやアプリ層の紹介もさせていただきたいですね!

なお、アドテクのRTB(Real-Time Bidding)といわれるシステムでは、DSP(Demand-Side Platform)は100msという短い時間の中で、リクエストを受け・諸々の判定や処理を完了し・レスポンスを返さなければならないのですが、そのような事業とシステムがなぜさくらインターネットさまのサービス上で動くことになったのか、素晴らしく分かりやすくまとまっている記事がありまして、

そんなわけで・・・ あわせて読みたいさくらのナレッジは(ry: "純国産の最先端アドテクが要求する「100ミリ秒」の性能要件とはなにか" いや、ほんと、素晴らしい記事を書いていただいたのでご一読いただけましたら!ぜひ!

あと、Togetterもまとめてます!

記念にTシャツいただきました!ありがとうございます!

f:id:mazgi:20140219213947j:plain

最後に、企画・運営してくださったさくらインターネットの皆さま、登壇者の皆さま、参加者の皆さま、本当にありがとうございました!

rbenvがすばらしすぎるので #Scala, #sbt, #PlayFramework 版をつくってみた。

最近Scala+sbt+Play Frameworkという環境で仕事をしているのですが、社内外の各種プロジェクトによってScalaもsbtもPlay Frameworkも必要なバージョンが違っていて、Ruby on RailsでもPlayでもその辺は変わらないんだなーと生暖かい気持ちになったりします。 Rubyにはrbenvがあって本当に素晴らしいですね! 「ないなら作ればいいじゃない!」ということでrbenvを写経しながらScalasbtPlay Frameworkのバージョンを切り替えるツールを作ってみました。

各ツールへのリンク

scalaenv
Scalaの各種バージョンを切り替えます。
sbtenv
sbtの各種バージョンを切り替え(ry
playenv
Play Frameworkの(ry
Read more

「第2回さくら #石狩DC 見学ツアー~さくらの夕べin石狩~」に参加してきた(1日目)

さくらインターネット様主催はてな様協力による「第2回さくら石狩DC見学ツアー~さくらの夕べin石狩~」にありがたくも当選したので、一昨日〜昨日(11/23〜11/24)にかけて行ってきました! ちなみに私は第2回の募集を@tagomorisさんのこのツイートで知りました。

うわさによると前回の150名を大きく超える応募があったようですし募集開始日に気づけたことはとても幸運でした。ありがとうございます。

iPhoneで撮った写真をflickrにCC BY-NCであげています。枚数が少ないのですが、blogや石狩DCの紹介に使っていただけたらうれしいです。

Togetterに1日目2日目のツイートをまとめてみました。DC内見学中はほとんどの方が紙とペンでメモを取っておられたのでツイートが減っていますが、当日の雰囲気が感じられるのではないかと思います。

では早速、拙いながらも石狩データセンターのすばらしさを書かせていただきたいと思います。

まずは石狩DC丼からご覧ください。

f:id:mazgi:20131123133828j:plain

石狩DCの会議室に案内していただくと、まずこの丼が迎えてくれました。 イクラも蟹もホタテも雲丹もすべてが美味しくて…!それから付け合せの山わさびが日本酒にとても良く合う味でした。 お昼でしたが「熱燗飲みたいですね」と隣の方に話しかけてしまったほどです。 ただ、最初山わさびをそれと知らず多量に口に入れてしまいとても危険な状態となりました。 データセンターではたとえ些細なことに思えても入念に確認する必要があるという示唆なのだと思います。

ちなみに新千歳空港ではなんとさくらインターネット社長の田中さんが旗を振って迎えてくださいました!

f:id:mazgi:20131123111842j:plain

美味しい石狩DC丼をいただいたあとは、データセンターの見学が始まるまでの短い休憩時間に#gentooinstallbattleを進めます。

f:id:mazgi:20131123140453j:plain

今回の#gentooinstallbattleさくらのクラウドで行います。 ゾーンはもちろん石狩です。

f:id:mazgi:20141210071146p:plain

サーバーインスタンスはデータセンターまでバスで移動する最中に作ったのですが、iPhoneからも操作できるさくらのクラウドはやはり素晴らしいですね!

起動用のISOイメージもバスの中でさくらのVPS東京リージョンに置いているGentoo Linux上からさくらのクラウドに転送しました。

f:id:mazgi:20131123125634j:plain

私が飛行機とバスを乗り継いで来た経路を、ISOイメージがパケットに分割され光ファイバーに乗って今まさに移動し、あっという間にバスを抜き去って、(この時点では)まだ見ぬ石狩DC内のサーバーに記録される様子を想像するとなんともアツいものがあります。 そう、まさに「最新鋭データセンターに萌える」という今回の主旨通りの展開です!

石狩DC見学(1回目)

バス内で#gentooinstallbattleをしたり順番に自己紹介をしている間に石狩データセンターに到着しました。

まずデータセンターの外観ですが、すでに知られているとおり特徴的な屋根の大きな建物です。 今回、データセンター内は会議室以外の部分が撮影禁止でしたので、代わりにスタッフの方が描かれたと思われるイラストを掲載します。

f:id:mazgi:20131124113213j:plain

すごくお上手ですね! なお、同ツアー参加者の@bash0C7さんによる石狩DC画像はこちらです。

1日目は主に開所時に建設された2棟のうち1棟内の各施設を見学させていただきました。 案内してくださったのはなんと田中さんご本人! どんな質問にも回答してくださり「本当に現場をよくご存知なんだな」と感じました。 私も「この機会に!」と技術的なことから運用や組織に関することまで色々と質問させていただきました!

施設内は電源周りや空調周りの設備など、規模がとても大きくて迫力がありました!広大な土地が確保できる"北海道ならでは"という設計になっているようです。

冷却のための外気を取り込む際の工夫や徹底した冗長化, 災害を検知する仕組みやミスを防ぐ仕組み等品質に関する取り組みが素晴らしく、「え、そんなことまで…?」と驚くことも多かったです。 かなりの頻度で改善されているように感じたのですが、田中さんが「社員に評判わるいから」という改善理由を何度か挙げておられたことが印象に残っています。数値だけを見て改善されてるわけじゃないんですね!

ノートに書きつけた石狩DCの素晴らしさを余すところなく記載したいのはやまやまなのですが、どこまでが公開可能な情報か判断がつかないため、代わりに石狩DCの素晴らしく多重化された施設とシステムを想像する助けになりそうな、@ysakakiさんによる2枚重ねのパンケーキ画像をご紹介します。

オペレーションルームでは、PUEや各種サーバー関連のデータがとてもグラフィカルに表示されていて、一言でいうととても厨2心をくすぐられました。 モニターをもうちょっとアレしたらデータセンターのオペレーションルームというより宇宙戦艦のソレになりますね、きっと。あとは照明とか壁の色とか。 FacebookのデータセンターのPUEが1.08くらい、2010年09月に経済産業省が25箇所のデータセンターで測定した際のPUE平均値が1.9(PDF)だそうですが、見学中にかなり良い数値が表示され、見学者から歓声が湧く場面もありました。

さくらの夕べ in 石狩

データセンター見学のあとは会議室に戻って「さくらの夕べ in 石狩」が開催されました。

石狩DCに常駐しておられる社員の方がプレゼンをしてくださったのですが、結構裏話的な内容が多くデータセンターカステラは手詰めされたことが発覚したりしました。

カステラ以上に心に残っているのはリブートの実演です。 サーバーの再起動をお願いした場合、かなり入念なチェック体制で作業を実施してくださるということが実演を通してとてもよく伝わりました。 感謝するとともにイレギュラーなリブートの必要が無いシステム構築をより一層心がけたいと思います。

@yojiroさんがツイートされているように、まさに"真心こもった作業"だと感じました。 なお、通常はIPMIを使用して再起動できるため、手動リブートを行うケースは少ないとのことです。

プレゼンの内容はもっと盛りだくさんだったのですが、すべてを書き記すことはできないため、代わりにこちらも盛りだくさんな@muranetさんの刺身十点盛りツイートをご紹介します。

懇親会・2次会・3次会・4次会

データセンターを満喫したあとはバスで札幌市内のホテルに移動し懇親会となりました。

上記がチャペルのような空間に90%以上男性で構成された集団が収容されている様子です。ファイブ・ナインにならなくてよかったと思います。 なお、懇親会はポラリスの間で行われました。

f:id:mazgi:20131123180228j:plain

その後ホテルにチェックインし、ススキノの街へと繰り出しました。2次会のためです。 なお、こちらがススキノで撮影された衝撃的な画像です。

2次会のあとは3次会に行ったはずです。 3次会のあとには4次会が開催されたと聞いています。 HAND PUMPのビールというものを教えていただき初めて飲みましたが、弱い炭酸が柔らかくて美味しかったです。美味しかった記憶があります。 都内で飲めるお店を探そうと思いました。

2次会以降については記憶に頼るよりも画像で確認したほうが正確であると考えられるため、当日のタイムラインから参考になりそうなツイートを紹介させていただきます。

田中さんさくらインターネット広報の方、さくらインターネットの皆さま、はてなの皆さま、JTBの方、ありがとうございました! カニごちそうさまでした。