2014-09-19
日本Chefユーザ会 なるものがいつの間にかできていたようで、Chef社の人も招いてMeetup が開催されると聞き、参加してきた。
先日発表されたChef 12 (参考日本語記事 )の簡単な紹介と、Chefのテスト環境に流れを追っての概要とデモがあった。新しい情報はそれほどなかったように思ったが、テストについてのデモ後は質問が活発に出たりしてなかなか面白かったので、メモ公開。
ちなみに、Chefユーザ会のハッシュタグは #getchef_ja だそうなので、日本語のChefに関連するつぶやきはここを見ておくのがよさそう。
新しくなったchef server
従来1組織しか管理できなかったがmulti tenantサポート
chef client
chef pushというクライアント側へのプッシュ機能が付く予定
Chef development kitがバージョンアップ
test-kichenやfoodcriticなどを含む
Enterprise版の機能
HA
replication
analytics
25ノードまでは有料版の機能を無料で使える
日本でEnterprise版を使いたければ、まずクリエーションライン さんに問い合わせ
クックブックのテストをする時は、以下のツールを使っていくことが多いよ、という話
test-kitchen
chef dev kitの一部
仮想マシンでクックブックをテスト
foodcritic
chef dev kitの一部
chefのお作法に沿った文法かチェック
rubocop
guard
ファイルシステム変更確認
これでcookbookの変更とかをチェックして、test-kichenやfoodcritic、rubocopとか走らせる
下の質問にもあるが、ローカル環境で動かしておいて、コミット前のテストを自動化するのに使う
serverspec
クックブックを実行した後に、対象のノードがどうなったかのチェックするのに使う
chefspecは、どうなるべきかクックブックで実装できてるかをチェックするツール
質問
クラスタがちゃんとセットアップできたかのチェックとかやりたいんだけど
serverspecのspecファイルはどこに置くの
mysqlだとクックブックのディレクトリのtest/integration以下に置いてる
MySQLのクックブック が一番ちゃんとテストしてあって色々な点で参考になる。読むなら一番いい
test-kitchenのサンプルとしてもMySQLがいい
Windowsで使いにくいんだけど
serverspecは全部実行した後にやると思うけどchefspec, test-kitchenとかはどのタイミングでかける?
chefspecはlocalで実行する
その後test-kitchenで確認する
guardはどう使う感じ?
基本はローカルで動かしておいてコミット前のチェックまで自動でやるもの
リモートで動かして使うことももちろんできる
cookbook内のattributeをserverspecで使いたい時はどうしたらいい?
serverspec側を何とかいじってattributeの書いてあるファイルを見るとかする他ない
test-kitchenするのにいいのありますか?(EC2だとお金かかっちゃうから)
DigitalOceanは(chef社からは)速いよ(ただし西海岸は。DigitalOceanはChefのユーザでもあるし)
速いところを探して使うしかない
test-kitchen -parallelを使えば並列実行できて速い
kitchen.yamlでnodeの情報にアクセスしたい
chef-zeroを使えばいい
chef-soloは将来的にdeprecatedになる予定
日本でのchefコミュニティを活性化させるにはどうしたらよいと思うか?
ビールが必要(笑)
頻繁に勉強会やmeetupやっていきたい
(逆に参加者への質問)女性chef関係者はいないのか?w
10/25の楽天テクノロジーカンファレンス でも、Michealさんが話をするそうで、参加者へのアンケート(?)の結果、Dockerと関連してChefを使う話を予定しているとのこと。
この後、Chef社とクリエーションライン社のおごりで、楽しくビールを飲みながらChefの話をしてお開き。
発表いただいたChef社の方、会場の準備などしていただいたクリエーションラインの方々、ありがとうございました。ビールごちそうさまでした。
2014-02-21
同じ会社で働いてる @kuwa_tw さんから紹介いただいて、WEB+DB PRESS vol. 79 の記事を書かせていただきました。雑誌に、というか印刷物に自分の書いたものが掲載されるのは初めての経験です。あまり歓迎されないけれども避けては通れない、メンテナンスという切り口で書かせていただいています。
始め、執筆の話をもらった時は、自分の書いた文章が印刷されて世に出るなんて想像もつかない出来事だなあと思っていましたが、実際手元に届いても、これが広く読者の方々に読まれるというのがどういうことなのかよくわかっておりませんw 皆さんからマサカリが飛んできて初めて理解できるものなのかもしれません。ご意見などありましたら @dblmkt までいただけるとうれしいです。
執筆のチャンスをくれた @kuwa_tw さんを始め、不慣れな我々をサポートしてくれた技術評論社の編集者の方、一緒に記事を執筆し色々なアドバイスをくれた同僚達にこの場を借りて感謝を表したいと思います。ありがとうございました!
2013-11-18
CentOS 5+Tomcat 7+JDK 7+Apacheという組み合わせで動かしていたサーバ群に、OSだけCentOS 6にしてミドルウェアのバージョンは変えないサーバを何台か追加したところ、CentOS 6の方が、Tomcatが確保している仮想メモリ量が圧倒的にでかいことに気づいた。
ちなみに、どちらのサーバもヒープサイズは「-Xmn1024m -Xmx2048m -Xms2048m」となっており、本来なら2GBプラスアルファ(コードキャッシュ他の領域分)しかメモリは食わないはずだ。もちろん、ロードバランサではどちらのサーバにも同じ重みでアクセスを流していおり、負荷は同じのはず。
CentOS 5のサーバ
こちらはざっくり3GB弱の仮想メモリを確保していると出ている(左から5番目、VSZの列)。ヒープサイズから考えるとまあこんなものかというレベル。
# ps auwx
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
31234 10315 110 8.8 3134280 1447956 ? Sl Nov14 6870:09 /usr/local/java/bin/java -Djava.util.logging.config.file=/usr/l cal/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -server -XX:MaxPermSize=128m -XX:PermSize=128m -XX:SurvivorRatio=2 -Xmn1024m -Xmx2048m -Xms2048m (後略)
CentOS 6のサーバ
一方こちらは10GB弱ものメモリを確保していることになっている。ヒープサイズとの差分9GB近くはどっから出てきたのか?
# ps auwx
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
31234 19463 156 33.6 11270576 2708744 ? Sl Nov14 9532:10 /usr/local/java/bin/java -Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -server -XX:MaxPermSize=128m -XX:PermSize=128m -XX:SurvivorRatio=2 -Xmn1024m -Xmx2048m -Xms2048m (後略)
CentOS 6の方のサーバのTomcatのプロセスIDを指定してpmapコマンドでメモリの確保状況を見てみると、何やら同じ容量(64MBぐらい)を確保しているanonという行がたくさん表示されているのが目につく。これが悪さしているようだ。ちなみに、一番右の列には通常そのメモリを確保しているファイル名が出るが、anonというのは匿名で割り当てのみがされた領域を示しているようだ。
# pmap -x 19463 | sort -k2 -n
Address Kbytes RSS Dirty Mode Mapping
(略)
00007f08d0218000 63392 0 0 -- [ anon ]
00007f0878215000 63404 0 0 -- [ anon ]
00007f099c208000 63456 0 0 -- [ anon ]
00007f08941fe000 63496 0 0 -- [ anon ]
00007f09341fb000 63508 0 0 -- [ anon ]
00007f091c1ea000 63576 0 0 -- [ anon ]
00007f08901e5000 63596 0 0 -- [ anon ]
00007f08fc1e3000 63604 0 0 -- [ anon ]
00007f09c01e0000 63616 0 0 -- [ anon ]
00007f094c1d8000 63648 0 0 -- [ anon ]
(略)
調べてみたところ、この現象は、CentOS 6に含まれているglibc 2.11の挙動によるものだそうだ。glibc 2.10から、スレッドごとにメモリ空間を割り当てるような実装に変わったとのこと。なお、CentOS 5ではglibcは2.5。以下、glibcのコミッタUlrich Drepper氏による2.10のchangelog解説 からの抜粋。
glibcに対する今回の変更では、スレッドごとにメモリプールを作るようになった。これで多くの場面で間違った割り当てを排除することができる。メタデータは通常1つのスレッド内でしかアクセスしない(スレッドは割り当てられたコアから移動されないのが望ましい)。アドレス空間を吹き飛ばしてしまうようなメモリのハンドリングを防ぐため、メモリプールの使い過ぎに上限が設けられた。デフォルトでは、32ビットマシンではコアあたりメモリプール2つ、64ビットマシンではコアあたりメモリプール8つを生成する。
プールが確保するサイズは64MBであり、上の例のCentOS 6のマシンの場合、CPUは24コアの64ビットマシンなので、「24コア x 8 x 64MB」が仮想メモリとして確保されているため、VSSの列の値が大きくなっていたというわけだ。なお、このプール用のメモリはあくまで割り当てられただけで使用されているわけではない。そのため、実際に使われているメモリはRSS(Resident Set Size)の列に表示されているものである(当然だが)。
Tomcat動かしてて気づいたのでタイトルが「TomcatのJVMが~」となっているが、同じようなつくりのメモリを大きく確保するアプリケーションでは同じことになるのは言わずもがな。
参考1 : Quoraのやりとり「なぜいくつかのアプリケーションはRHEL5と比べてRHEL6では明らかに大きな仮想メモリを使うのか?」
参考2 : IBM developerWorksの記事「Linuxのglibc 2.10以上(RHEL6)のmallocは仮想メモリの使用量を過大に表示するのか」
参考3 : StackOverflowのやりとり「Linux上でのJavaの仮想メモリ使用量が大きすぎる」
解説が非常に詳しくてためになる。
参考4 : 上述glibcコミッタUlrich Drepper氏の記事