としたにあんの左脳

備忘録です.

Ubuntu12.04のulimitの上限を上げる.

Ubuntu 12.04(他のLinux系OSも同じだと思う)でこんなプログラムを動かすと.

IOError: [Errno 24] Too many open files: xxx

っていうエラーがでる.

以下のコマンドで確認できるファイルオープン数の上限が1024になっているせいでファイルオープンできなくて,エラーを吐いている.

ulimit -n
>1024

以下のサイトを参考にファイル上限をあげてみた.vagrantで動かしているUbuntu12.04 LTS Serverで実験した. How to set ulimit in ubuntu linux? getting sudo: ulimit: command not found error | ubuntu forums

編集内容

sudo emacs /etc/security/limits.conf

以下を追加

vagrant hard nofile 65535
vagrant soft nofile 65535

sudo emacs /etc/pam.d/su

以下のコメントアウトをはずす

# session    required   pam_limits.so
sudo reboot

再起動後,同じプログラムを動かしてもエラー吐かなくなった.

ファイルオープン数の上限に達すると,TCPソケット開けないし,ライブラリのインポートできないしで,オワタ状態になるのでチューニングちゃんとしないといけないっすね.

夜間バッチでzabbixのトリガーを発動させない方法

zabbixを使って監視をしている.

最近,夜間に走らせているDBのバックアップスクリプトのせいで,

PROBLEM: Disk I/O is overloaded on XXX

のアラートメールが来まくる.

良くない.

Template OS Linuxのデフォルトでは直近5分間のiowaitが20%を超えるとトリガーが発動するらしい.

{Template OS Linux:system.cpu.util[,iowait].avg(5m)}>20

これを,夜間の一定時間だけトリガーを発動しないように変更した.

3時から4時の間はトリガーを発動しない.

( {Template OS Linux:system.cpu.util[,iowait].avg(5m)}>20) &
(({Template OS Linux:system.cpu.util[,iowait].time(0)}>040000) 
| ({Template OS Linux:system.cpu.util[,iowait].time(0)}<030000))

こんな構造になっている.

A & ( B | C )

当初は,これを条件式ビルダーでつくろうとしてうまくできなかった.

かっこの使い方がミソみたい.

motoはソケットを使うライブラリと併用できない問題

motoを使ってテストをしてた時,テスト中にテストが進まなくなる現象が起きた.

テストを見てみると,pymongoを使ってmongodbを叩いているプログラムのテストだった.(もちろんそのメソッドでbotoを使っていた)

そのテストはmockを使わずに,実際のmongodbインスタンスを使ってテストしていた.

悩んでいると,横の席の彼がこんなリンクを送ってくれた.

Interference with other network code · Issue #9 · spulec/moto · GitHub

要約するとmotoは全てのソケットをインターセプトしてしまうらしい.

なので,motoを使ったテストでは.httpリクエストやDBアクセスなどはモックを使って行わなければならないようだ.

requestを使ったサンプル

requestsを使ってHTTPアクセスするプログラムで実験してみた.

サンプルプログラム

requestsでgoogleにアクセスして,そのステータスコードをS3に保存するプログラム.

問題のあるテストコード

$ python test_with_moto_and_requests.py

このテストを実行するとかえって来なくなる.

動くテスト

ちゃんとrequestsのモックを作ってあげてテストをしたら良い.

pythonでbotoを使ったプログラムのテストをする

pythonでS3を使ったプログラムを書く際に使用するライブラリとしてbotoが有名だと思う.

使い方は以下のサイトとかを参考にしたらいいと思う.

[Python] botoを使ってS3にファイルを保存する

boto でさくらのBASE Storageを弄る « 不定期な記録

botoのサンプルプログラム

すごく簡単なサンプルはこんな感じ.

ホームディレクトリに.botoを置いてあげなきゃいけない

[Credentials]
aws_access_key_id = <your access key>
aws_secret_access_key = <your secret key>

motoを使ってテストする

プログラムを書いたらテストをしなきゃないけない.

しかし,テストのたびにS3にファイルを作られても困る.

あと,CIサーバには認証情報を置きたくない.

そんな時にはmotoを使うと良い.

普通にユニットテストを書いてみた.

ここで,~/.botoを削除して認証情報をなくした上で,テストを実行してみる

$ rm ~/.boto
$ python test.py

E
======================================================================
ERROR: testMain (__main__.BotoSampleTestCase)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "test.py", line 13, in testMain
    self.assertEqual(sample(), 'test')
  File "/Users/kawasakitoshiya/workspace/tmp/mock_s3/boto_sample.py", line 5, in sample
    conn = boto.connect_s3()
  File "/Users/kawasakitoshiya/.virtualenvs/default/lib/python2.7/site-packages/boto/__init__.py", line 140, in connect_s3
    return S3Connection(aws_access_key_id, aws_secret_access_key, **kwargs)
  File "/Users/kawasakitoshiya/.virtualenvs/default/lib/python2.7/site-packages/boto/s3/connection.py", line 190, in __init__
    validate_certs=validate_certs, profile_name=profile_name)
  File "/Users/kawasakitoshiya/.virtualenvs/default/lib/python2.7/site-packages/boto/connection.py", line 568, in __init__
    host, config, self.provider, self._required_auth_capability())
  File "/Users/kawasakitoshiya/.virtualenvs/default/lib/python2.7/site-packages/boto/auth.py", line 879, in get_auth_handler
    'Check your credentials' % (len(names), str(names)))
NoAuthHandlerFound: No handler was ready to authenticate. 1 handlers were checked. ['HmacAuthV1Handler'] Check your credentials

----------------------------------------------------------------------
Ran 1 test in 1.090s

FAILED (errors=1)

認証情報が無いのでテストに失敗する.

motoを使ってテストする

motoはS3のモックを作ってくれる.

気を付けなきゃいけないのは, motoが作ってくれるモックに,プログラムで使用するのバケットをテストコードで毎回生成してあげること.

$ python test_with_moto.py
.
----------------------------------------------------------------------
Ran 1 test in 0.057s

OK

これで快適boto生活!

注意点

motoはソケットを使うプログラムと併用できない仕様になっているみたいなので,注意が必要. それについては次の記事でかいてみようと思う

motoはソケットを使うライブラリと併用できない問題 - としたにあんの左脳

qpstudyに行ってきた

業務経験半年な右も左もわからないペーペーのインフラエンジニアなので

qpstudy 2014.04 一般枠 〜俺の屍を超えて行け、でも踏まないで〜 on Zusaar

に参加してきました!

勉強会って結構敷居高いイメージあるけど、すごく敷居が低い感があって行きやすかったです.

あとインフラの勉強会ってあんまり見たことなかったのですごくありがたかったです.

セッションの感想

インフラエンジニアとは、なんだ @sho7650 さん

http://www.slideshare.net/sho7650/ss-33703096

インフラエンジニアって一般的にどこまでが役割かってのを理解できていませんでしたが、

データセンター/ネットワーク/ハードウェア/OS/ミドルウェア/アプリケーション

っていうレイヤーがある中で

ネットワーク/ハードウェア/OS/ミドルウェア

っていうのは"基盤"としての妥当なだよね.っていうことで、 インフラエンジニアを名乗る上でそこは必ず習得すべきだと思いました.

あと,ウォーターフォールモデルの各ステップについて具体的にどういうことをやるべきかっていうのを話してくださり非常に参考になりました. 学校で勉強して,理解しているつもりでも,よくわかっていないものなので,感覚を聞けたのは収穫でした. アジャイルも結局はウォーターフォールを小さくしたものの繰り返しっていうのは賛同しました.

非機能要件グレードはちゃんと見てみようと思いました.

ウォーターフォールモデルで何をすべきかっていうところは是非スライドを見て欲しいです.

インフラアーキテクチャ設計の勘所 @sechiro

http://www.slideshare.net/sechiro/qpstudy201404

"インフラ設計のインプット"

機能要件はブレークダウンしていけば洗い出しをしていくことができるけど,非機能要件はブレークダウンしていくだけでは出てこないことも多い.非機能要件を洗い出すために,経験や過去の案件から出したり,非機能要件グレードか洗い出したりしていくことが必要になる.

非機能要件グレードは有効に活用していこうと思いました.

要件をインフラ設計に落とす ベースはWeb三層モデル

なぜ三層にわけるか? + 層ごとの目的に特化したソフトウェアの組み合わせができる + 共通モデルを採用することで層ごとの入れ替えができる

基本的にWeb三層モデルを使えば多くの場合には対応可能ですね.

壊れていいものと壊れてはいけないものを分けることも重要だと感じました.

インフラエンジニアには説明責任がある 守破離

 ハードウェア設計の勘所 @hasegawさん

http://www.slideshare.net/TakeshiHasegawa1/qpstudy201404-dist

プロセッサー,メモリ,ネットワーク,ストレージの動作原理を解説していただき,ちゃんと勉強しなきゃなと思いました.

ストレージで以下のことを意識して設計をする必要がある + HDDは Read/Writeは同じくらい + SSDは Readは高速 書き込みは低速 書き換えはど低速

最近のフラッシュドライブのIO性能は,ちょっと前のDIMMを上回っているというのは知らなかったので,メモリ制約のある場合はフラッシュドライブでがんばるのも検討してみたい.

RAID構成でストレージを使う場合に気をつけるべき点も勉強になりました.

OSとネットワーク設計の勘所 @yktkoさん

http://www.slideshare.net/yktko/20140419qpstudyosnw

レイヤ感覚

どこでどんな処理が起こっているかを理解することは重要.

自分で障害対応した時も,レイヤ感覚がなかったので,問題の切り分けをうまくすることができなかったので

この感覚をもっと付けなければと思いました.

特にカーネルのとことかは見つけづらいので,経験は大事.

これ欲しい

Linuxカーネル2.6解読室

Linuxカーネル2.6解読室

時間間隔

cronをサーバに設定した結果... File System Full ちゃんと考えて自動化します

ログローテーション 障害対応の時はしっかりお世話になっているので,どういう原理でローテーションされているのか理解して活用していきます

システムタイム 2038年が恐い.

トラブル感覚

実際にサーバを触って何が起きているかをわかるようにならなければ.

いつ来るかわからない15分のために常に準備をしているのがプロ.

来ないかもしれないと言って,準備しないのがアマチュア

ミドルウェア設計の勘所 @nekoruriさん

http://www.slideshare.net/nekoruri/4-33705917

"ミドルウェア"って結局どこのことか.→HW/OS/アプリ以外の全て

ビジネス的価値を持つアプリケーションを動かすための超重要なソフトウェア.要件を満たすようにそれらをうまく組み合わせて行かなければならない.

Web+AppサーバはStatelessに保っていつでも再構築できるように設計する.

DBサーバのデータは死ぬ気で守る

サービスの特性に合ったDBを選定することは重要

メトリクスをしっかりと取って,ボトルネックの把握をする.

推測するな計測せよ

どうすればこの先生き残れるかも伝えてくださったので,そこを意識して行かなければ.

@netmarkjpさん

【諸般の事情で資料は公開しない】

  • 信頼を積み重ねる
  • アジリティの時代 知識と経験と行動力とクラウドとプログラミング
  • 自分が変えられるのは自分だけ
  • 答えはない.重要なのは相手にとっての価値
  • 先生を見つける

インフラエンジニアとしてはもちろん,社会人としてどう生きていくかについても学びがあった.


今回は予定があって,懇親会いけなかったけど次回こそいこう