そろそろCentOS7さわっていくか xfsの設定を変更してみる

という訳で本番環境でまだまだCentOS(RHEL7)は本番環境で使ってませんが
2015はCentOS7系を構築していくと思いますので理解を進めて行きたいと思います。


まず最小限の構成でインストール。
ファイルシステムのデフォルトのフォーマットがxfsになってます。
という訳でxfsをざっとチューニングしてみたのが下記。

UUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX / xfs  noatime,nobarrier,logbsize=256k,logbufs=8,allocsize=2M,delaylog 1 1


nobarrier
ファイルシステムの安全性を高めるオプションをオフにして性能をあげる。
RAIDコントローラやディスクキャッシュが無効だったり、
ハードRAIDでバッテリーバックアップでcacheが守られているような
ストレージならこのオプションを入れて性能を取る。


logbsize
メモリ上のログバッファのサイズ。ioが多いシステムは256kが推奨。
大きくするとログの処理が高速になる。


logbufs
log buffer数を多くすると削除時のパフォーマンスが向上する。
2〜8が設定可能という事から8を選択。


allocsize
延滞書き込み時のバッファ I/O end-of-fileプリアロケーションサイズ。
デフォルトは64k。


delaylog
ログの延滞書き込みを有効にしてログを減らす。


上記の設定で試していって今後改善していってみます。

grepの一部機能をGo言語で実装してみた

サービスの運用業務でgrepコマンドはよく使うのですが、
前回実行してから行数が増えたので差分だけgrepしたい
という要件とかもあります。


gogrep "検索文字列" "検索ファイル"
gogrep "検索文字列" "検索ファイル" "検索開始行"
という機能だけとりあえず実装してました。


GitHub - bose999/GoGrep: GoGrep has the function of the part of Grep.
上記に置いてあります。


という事で開発したMac Book Pro Retina 15
(Marvericks/Corei7/Mem 16GB/SSD 512GB)上で
OSのgrepとgoGrepの性能をざっとくらべてみます。


まず検索対象のテキストファイルを1GBくらいで生成

% cat makeRandomText.sh
#!/bin/bash
for i in `seq 1 1048576`
do
  pwgen -0A 1024 1 >> /Users/matakeda/Documents/a.txt
done
% ls -lah /Users/matakeda/Documents/a.txt
-rw-r--r--  1 matakeda  staff   1.0G 12 29 18:15 /Users/matakeda/Documents/a.txt


次に実行した時間を秒で表示して処理結果をdiffするシェルを3回実行

% cat grep-time.sh
#!/bin/bash
echo "GoGrep & Grep 実行"
GG_START=`date +'%s'`
/Users/matakeda/Documents/git/GoGrep/bin/gogrep "doshuc" /Users/matakeda/Documents/a.txt > ./gogrep.out
GG_END=`date +'%s'`

G_START=`date +'%s'`
/usr/bin/grep "doshuc" /Users/matakeda/Documents/a.txt > ./grep.out
G_END=`date +'%s'`

echo "GoGrep"
echo `expr $GG_END - $GG_START`
echo "grep"
echo `expr $G_END - $G_START`
echo "diff"
echo `diff ./gogrep.out ./grep.out`
echo "finish"
% ./grep-time.sh
GoGrep & Grep 実行
GoGrep
3
grep
14
diff

finish
% ./grep-time.sh
GoGrep & Grep 実行
GoGrep
3
grep
15
diff

finish
% ./grep-time.sh
GoGrep & Grep 実行
GoGrep
3
grep
15
diff

finish


grepが約14秒〜15秒、gogrepが約3秒という結果になりました。
ランダムアクセスとか使わないで先頭からのテキストファイルの
行ループを使って並列処理をガンガン書いたわけでも無いのに
思ってたよりも処理早いですね。。。w
これ業務で休み明け使いますわ。