2012年6月30日土曜日

nuttcpを使ってネットワークのスループットを測定してみた

1. まずはダウンロード
http://www.wcisd.hpc.mil/nuttcp/Nuttcp-HOWTO.html
※公式(っぽいです)
HTML, FTP, ローカルコピーどれでもいいのでソースを持ってきます
ソースからのインストールしかなさそうです
今回も例のごとくyoshi3サーバで行います
※以下で紹介しているパスは適当に作成しておりますので適宜変更していただいて問題ございません

[root@yoshi3 28_20120628_nuttcp]# wget http://www.lcp.nrl.navy.mil/nuttcp/beta/nuttcp-7.1.6.c
--2012-06-27 11:57:07-- http://www.lcp.nrl.navy.mil/nuttcp/beta/nuttcp-7.1.6.c
www.lcp.nrl.navy.mil をDNSに問いあわせています... 132.250.114.61
www.lcp.nrl.navy.mil|132.250.114.61|:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 251878 (246K) [text/plain]
`nuttcp-7.1.6.c' に保存中

100%[=====================================================================================================================================>] 251,878 179K/s 時間 1.4s

2012-06-27 11:57:11 (179 KB/s) - `nuttcp-7.1.6.c' へ保存完了 [251878/251878]

[root@yoshi3 28_20120628_nuttcp]# cc -O3 -o nuttcp nuttcp-7.1.6.c
[root@yoshi3 28_20120628_nuttcp]# ls
nuttcp nuttcp-7.1.6.c
[root@yoshi3 28_20120628_nuttcp]# cd /usr/bin/
[root@yoshi3 bin]# ln -s /root/28_20120628_nuttcp/nuttcp nuttcp
[root@yoshi3 bin]# ls -ltr | grep nuttcp


2. 測定開始

[root@yoshi3 bin]# nuttcp -S (サーバ側起動)
[root@yoshi3 bin]# ps aux | grep nuttcp
root 4945 0.0 0.0 6028 296 ? Ss 13:21 0:00 nuttcp -S
root 4947 0.0 0.1 65440 872 pts/0 R+ 13:21 0:00 grep nuttcp
[root@yoshi3 bin]# nuttcp yoshi3 (yoshi3サーバへリクエストしたときのスループットを測定)
10646.0469 MB / 10.01 sec = 8921.2350 Mbps 14 %TX 24 %RX 0 retrans 0.03 msRTT
[root@yoshi3 bin]# nuttcp -il yoshi3
2785.8750 MB / 1.00 sec = 23325.0159 Mbps 0 retrans
1611.8125 MB / 1.04 sec = 13060.3425 Mbps 0 retrans
860.1250 MB / 1.06 sec = 6833.2263 Mbps 0 retrans
818.3125 MB / 1.00 sec = 6864.0772 Mbps 0 retrans
826.5000 MB / 1.02 sec = 6816.7745 Mbps 0 retrans
725.3125 MB / 0.93 sec = 6561.1123 Mbps 0 retrans
813.2500 MB / 1.02 sec = 6714.9719 Mbps 0 retrans
802.7500 MB / 1.00 sec = 6722.3053 Mbps 0 retrans
819.3750 MB / 1.05 sec = 6574.1851 Mbps 0 retrans
717.8125 MB / 0.91 sec = 6638.5398 Mbps 0 retrans

10785.7344 MB / 10.01 sec = 9038.6793 Mbps 13 %TX 25 %RX 0 retrans 0.02 msRTT

3. 測定結果

----------------------------------------------------------------------------------------
↓1秒の間に送信したパケット量
2785.8750 MB / 1.00 sec = 23325.0159 Mbps 0 retrans
使っているethカードの最大帯域↑
----------------------------------------------------------------------------------------

----------------------------------------------------------------------------------------
↓10秒間で送信したパケットの合計
10785.7344 MB / 10.01 sec = 9038.6793 Mbps 13 %TX 25 %RX 0 retrans 0.02 msRTT
使っているethカードの最大帯域の平均↑
----------------------------------------------------------------------------------------

結果から読み取れる概要としては
・ネットワークの帯域的には10Gくらいあるネットワーク使ってますよ
・データ転送量的には1秒間で800Mくらいは送れますね
・13%TXがクライアント側の平均CPU使用率、25%RXがサーバ側の平均CPU使用率
といったところでしょうか
開始時に値が大きくなっているのはなんかこうなっちゃうみたいです
おそらくは、スイッチ等のネットワーク機器がethカード以上の帯域を専有しないいように絞っているのでしょう
また、オプションなしで実行しているこの環境は双方向通信の測定結果になります

4. その他オプションなど
「-D」を指定すると下りの性能のみを計測
「-B」を指定すると上りの性能のみを計測
⇒こちらもやってみましたが、あまり双方向通信の結果と変わりませんでした
「nuttcp」とコマンドを実行すればヘルプも出るようです

2012年6月29日金曜日

mysqlで現在の書き込み、読み込み状態を確認する方法

mysqladmin -p processlist

※rootにパスワードを設定している場合には-pをつけてからパスワードを入力する必要があります
これを実行してInfo欄に「show processlist」が表示されているレコードのみ表示されれば他に動作しているプロセスはありません

あとはこの辺で状態確認が行えます
mysqladmin -p status
mysqladmin -p extended-status

長くなってしまう場合はコマンドの最後に「\G」をつけるといい感じに整形してくれます

2012年6月28日木曜日

【Jenkins】ビルド結果に出力される「成功」「失敗」に色をつけるプラグイン(Log Parser Plugin)

P.S 20140805
タイトル修正しました
本文の体裁を整えました

1. インストール
普通にJenkinsのプラグインインストールからいきましょう
以下の名前のプラグインをインストールします

2. 設定
以下のようにファイルを作成します
cd ~/.jenkins/
mkdir log
cd log/
touch stu_fix_log.txt
emacs stu_fix_log.txt
----------------------------------
error /^failed:/
info /executing/
----------------------------------
今回はerrorとinfoレベルに分けたいと思います

Jenkinsの管理→システムの設定から以下のように設定


ジョブ名→設定から以下を設定

3. 確認
一旦ビルドしましょう
ビルド結果を確認すると左メニューに「Parsed Console Output」が増えています
これをクリックするとコンソール出力に
errorと設定した文字列を含む部分が赤色になり
infoと設定した文字列を含む部分が青色になっている
ことがわかると思います

2012年6月27日水曜日

【Ruby】Capistranoを使ってみた(gitとJenkinsもちょっと連携)

インストールについては適当にググってやってくださいw
「capistrano インストール」でガッツリでてきます

以下いろいろと使ってみた結果です
コマンドのとこだけ実行していくと基本的な設定と動作はできるようになります

mkdir /usr/local/cap
cd /usr/local/cap
capify .
(不思議なおまじないです)
cap -T
(capで実行できる命令が一覧で表示されます)
emacs config/deploy.rb

set :application, "stu"                                                               
set :repository,  "git://github.com/kakakikikeke/shorten_the_URL.git"                 
set :scm, :git                                                                 
                                                                                      
role :web, "yoshi3"                                                                   
role :app, "yoshi3"                                                                   
role :db,  "yoshi3", :primary => true                                                 
role :db,  "yoshi3"                                                                   
                                                                                      
# if you want to clean up old releases on each deploy uncomment this:                 
# after "deploy:restart", "deploy:cleanup"                                            
                                                                                      
# if you're still using the script/reaper helper you will need                        
# these http://github.com/rails/irs_process_scripts                                   
                                                                                      
# If you are using Passenger mod_rails uncomment this:                                
# namespace :deploy do                                                                
#   task :start do ; end                                                              
#   task :stop do ; end                                                               
#   task :restart, :roles => :app, :except => { :no_release => true } do              
#     run "#{try_sudo} touch #{File.join(current_path,'tmp','restart.txt')}"          
#   end                                                                               
# end

http://d.hatena.ne.jp/officel/20120228/p1
でCapifileをちょっと設定変更
cap deploy:setup
で以下が作成された

[root@yoshi3 u]# cd /u
[root@yoshi3 u]# ls -lR
.:
合計 4
drwxr-xr-x 3 root root 4096  6月 22 21:29 apps

./apps:
合計 4
drwxrwxr-x 4 root root 4096  6月 22 21:29 stu

./apps/stu:
合計 8
drwxrwxr-x 2 root root 4096  6月 22 21:29 releases
drwxrwxr-x 5 root root 4096  6月 22 21:29 shared

./apps/stu/shared:
合計 12
drwxrwxr-x 2 root root 4096  6月 22 21:29 log
drwxrwxr-x 2 root root 4096  6月 22 21:29 pids
drwxrwxr-x 2 root root 4096  6月 22 21:29 system

cap deploy:check
ちゃんとdeploy:setupが実行されたかをチェックします

と基本的なコマンドは以上かと思います
あとはその他のコマンドについて何ができるのかメモっておきます

cap deploy:cold
gitからソースコードをデプロイしてくれます
Rackfileがないプロジェクトなので警告が表示されますが、デプロイはされました

cap deploy:web:disable
/u/apps/stu/shared/system/maintenance.html
を作ってくれます
このパスをApacheとかのメンテ画面に設定しておくとこれを実行するだけでメンテ画面になる

cap deploy:web:enable
/u/apps/stu/shared/system/maintenance.html
を削除してくれます。メンテ画面解除ができます

cap deploy:cleanup
/u/apps/stu/releases/配下の日付フォルダの古い順から5件削除してくれるみたい

cap deploy:create_symlink
/u/apps/stu/currentを
/u/apps/stu/releases/配下で一番新しいフォルダに切り替えてくれます

cap deploy:migrate
current配下に対してrakeを実行します(ビルド実行みたいな感じか)
ローカルビルド的な

cap deploy:migrations
途中で失敗
gitに対して何かしようとしてる感じからおそらくリモートコミットかなーと
鍵とかの設定ができていればcapからgitコミットもできそう

かなり不確定でかつ途中ですが、まぁ参考程度にw
やっぱりいちばんイイのは自分で.rbファイルのレシピを作ることですかね
あとは「deploy:cold」の中でいろいろと実行しているのでとりあえずdeploy:coldができれば問題ないですね
deploy:coldの中身
------------------------
cap deploy:update_code
cap deploy:finalize_update
cap deploy:create_symlink
------------------------
Jenkinsからコマンドキックするときはdeploy:coldではなくて上記3つのコマンドを並べたほうがよさそうですね

っていうかなんでRubyは「レシピ」って呼び方をするのだろうか?


P.S 20130513
■Tips
  • deploy.rb内に「:user」「:password」を設定するとcapコマンド実行時にパスワードを聞かれなくなる
  • capコマンドを実行するとまずCapifileが読まれ、その中でdeploy.rbをloadしているため「:user」「:password」の設定はcap shellなどを実行時にも読み込まれる
  • sshが秘密鍵認証の場合は以下2つを指定するとできるようになる
  • ssh_options[:keys] = %w(/path/to/private_key)
    ssh_options[:passphrase] = "private_key_password" 
■サンプルレシピ
以下をconfig/deploy.rbに記載する
namespace :sample do
  desc <<-DESC
    This is a sample capistrano recipe.
  DESC
  task :hostname, :roles => :app do
    run "hostname"
  end
end
:appにrolesが設定してあれば
cap sample:hostname でrolesに設定したサーバのホスト名が表示される
cap -T にも表示されるようになる
desc の宣言がない場合は cap -vT をしないとタスク一覧には表示されない

2012年6月25日月曜日

【Jenkins】Persona Pluginをインストールして設定する方法

Persona PluginはJenkinsの背景画像やビルド結果のアイコンを簡単に変更することができるプラグインです。
設定はXMLファイルで行います。
公式サイトです。https://wiki.jenkins-ci.org/display/JENKINS/Persona+Plugin

1.Persona Pluginのインストール
Jenkinsの管理→プラグインの管理→利用可能
で「Persona」で検索し「Person Plugin」を選択しダウンロードして再起動後にインストールを押下

2.設定(必要なフォルダ、ファイルの作成)
JENKINS_HOMEはTomcatのデプロイでインストールすると「~/.jenkins/」になります
JENKINS_HOMEが確認できたら以下のコマンド参考に必要なフォルダ、ファイルを作成していきます

・Persona Pluginの設定
cd ~/.jenkins
mkdir persona
cd persona/
mkdir yoshi3 ← Persona用のフォルダです、この階層に別のフォルダを作成すれば他の設定使えるようになります
cd yoshi3/
touch persona.xml
emacs persona.xml
※persona.xmlの内容はとりあえずデフォルトのものを使いましょう、以下を貼り付けてください
<persona displayname="Daniel J. Bernstein" id="djb">
  <quote>Just because it's automatic doesn't mean it works.</quote>
  <quote>Be careful what you wish for you just might get it.</quote>
  <quote>I do engineering, not religion.</quote>
  <quote type="success">This is only for stable builds.</quote>
  <quote type="failure">This is only for unstable builds.</quote>
  <quote type="other">This is only for failed builds.</quote>  ...
</persona>

画像を準備します
画像は.jpg/.png/.gifが可能でです。
ワタシはyoshi3フォルダ配下に「success.png」「failure.png」「other.png」を用意しました

以下が設定結果となります。
[root@yoshi3 yoshi3]# pwd
/root/.jenkins/persona/yoshi3
[root@yoshi3 yoshi3]# ls -ltr
合計 20
-rwxr--r-- 1 root root 1465 6月 22 00:52 success.png
-rwxr--r-- 1 root root 1373 6月 22 00:53 failure.png
-rwxr--r-- 1 root root 1372 6月 22 00:53 other.png
-rwxr--r-- 1 root root 1431 6月 22 01:00 icon.png
-rwxrwxrwx 1 root root 374 6月 22 01:13 persona.xml

・Jenkinsの設定
Personaを適用したいジョブに移動して左にあるメニューから「設定」を選択します
一番下「ビルド後の処理」で「ビルド後の処理の追加」を押下し「Associate Persona」を選択します
すると「Persona」と「Location」という属性の値を設定する入力欄が現れるので先程作成したPersonaの「yoshi3」を選択し、Locationには「Bottom-Right」を選択しましょう
Locationはビルド結果画面で実際に設定した画像を表示する位置になります。お好みに合わせて変更してみてください

※Jenkins側の設定は以下で説明するリロードリクエストを一回行なってからでないと選択項目に作成したPersona情報が表示されないかもしれません

3.確認
http://yoshi3:8080/jenkins/reload-persona/
でpersona.xmlを読み込んで設定は反映します
対象のジョブで一度ビルドを実行しましょう
ビルド結果を見ると設定した画像と文章が反映されていると思います

以上で完了です
persona.xmlを変更した場合は再度reloadのURLをリクエストしましょう
その後のビルドから変更が反映されるようになります

2012年6月22日金曜日

CentOSでJenkinsをインストール【Java、Tomcat、antからgit連携まで】

  1. Javaのインストール
  2. Tomcatのインストール
  3. antのインストール
  4. Jenkinsのインストールと基本設定
  5. ジョブの作成とGit連携設定(Git連携設定)
  6. GitHub側設定
※1, 2. 3のインストールが済んでいる方は3から見ていただければと思います。

1.Javaのインストール

rpm -ivh --prefix=/usr/local/java/ jdk-7u5-linux-x64.rpm
cd /usr/bin/
ln -s /usr/local/java/jdk1.7.0_05/bin/java java
export JAVA_HOME=/usr/local/java/jdk1.7.0_05/
java -version

2.Tomcatのインストール

wget http://ftp.jaist.ac.jp/pub/apache/tomcat/tomcat-7/v7.0.27/bin/apache-tomcat-7.0.27.tar.gz
tar xvf apache-tomcat-7.0.27.tar.gz
mv apache-tomcat-7.0.27 tomcat
mv tomcat /usr/local/
cd /usr/bin/
ln -s /usr/local/tomcat/bin/startup.sh tomstart
ln -s /usr/local/tomcat/bin/shutdown.sh tomstop
tomstart
tomstop

※tomcatの起動スクリプトも作成しましたので起動スクリプトも登録したい方はこちら

3.antのインストール

http://ftp.yz.yamagata-u.ac.jp/pub/network/apache//ant/binaries/apache-ant-1.8.4-bin.tar.gz
mv apache-ant-1.8.4 ant
cd /usr/bin/
ln -s /usr/local/ant/bin/ant ant
export ANT_HOME=/usr/local/ant/

※Tomcatのコンテナとしてデプロイする方法を紹介します
※コンテナとしてデプロイする場合にはここの設定も見ておくといいかもしれません
4.Jenkinsのインストール

wget http://mirrors.jenkins-ci.org/war/latest/jenkins.war
ls -ltr ~/.jenkins
※ここが$JENKINS_HOKEに設定されている、設定ファイルもここをいじるように
mv jenkins.war /usr/local/tomcat/webapps/
・セキュリティ設定(ユーザ設定)

Jenkinsの管理→システム設定→セキュリティの有効化ON→アクセス制御→ユーザ情報→Unix ユーザー/グループ データベース
同じく権限管理→ログイン済みユーザーに許可
で適用を押下
※このときユーザ情報で何も選択しないで適用してしまうと設定ファイルを変更する必要が出てくるので注意しましょう詳しくはこちら
※セキュリティ設定をするとすぐにログイン画面に遷移するので、ログインしてください
ログインは設定したとおり「Linuxでログインするユーザ名とパスワードです」
・Java、ant設定


Jenkinsの管理、システム設定、JDK and Antの設定をします
自動インストールのチェックをはずしてそれぞれ先程設定したJAVA_HOME、ANT_HOMEを記載します

5.ジョブの作成とGit連携設定(Git連携設定)

・GitHub Pluginをインストール
Jenkinsの管理→プラグインの管理→利用可能で「git」で検索して「GitHub plugin」をインストールします
インストール後Jenkins(Tomcat)の再起動が走ります
・ジョブ作成
フリースタイル・プロジェクトのビルドを選択
ソースコード管理システムでGitを選択
ビルド・トリガでBuild when a change is pushed to GitHubを選択
ビルドを以下のように設定


6.GitHub側設定

ログイン後jenkinsと連携するリボジトリに移動
Adminをクリック(スパナのマークが書いてあるボタン)
Service Hooksをクリック
WebHook URLsを選択して
URLに以下を記載
「http://username:password@ipaddress:8080/jenkins/job/shorten_the_URLbuild?delay=0sec」
Test Hookを押下
Jenkinsに戻ってと対象のジョブでビルドが走っていることを確認する

※usernameとpasswordはJenkinsにログインする際のユーザ名とパスワードを設定します
(4.で設定した通りJenkinsのログイン管理はLinuxのユーザで設定しているのでLinuxsに登録されているユーザ名とパスワードです)
※ホスト名解決ができない場合はJenkinsがインストールされているサーバのIPADDRESSを入力しましょう
※これでダメな場合はGitHubからの8080アクセスがiptablesなどのFWで拒否されている可能性があります
GitHubの外向けのIPアドレスは(おそらく)50.57.128.197な気がしていますが、普通に考えたらグローバルの外向けIPアドレスは複数あると思いますので、できるならCIDRで0.0.0.0/0を設定しましょう(セキュリティ上はよくないですが・・・)

これでGitHubの対象のリポジトリににpushされるとJenkis側にリクエストが来て自動でJenkisがビルドを開始します

2012年6月21日木曜日

【Tomcat7】tomcatの起動ファイルを作成してみた

cd /etc/init.d/
touch tomcat
chmod 755 tomcat
chkconfig --add tomcat
chkconfig --list | grep tomcat
---
tomcat 0:off 1:off 2:on 3:on 4:on 5:on 6:off
---
vi tomcat
で以下を貼り付けてください
#!/bin/sh
#
# Startup script for Apache Tomcat 7.0.27.0
#
# chkconfig: 2345 85 15
# description: Apache Tomcat Java Servlets and JSP server
# processname: tomcat
# pidfile: /var/run/tomcat.pid
# config: /usr/local/tomcat/conf/server.xml

# Source function library.
. /etc/rc.d/init.d/functions

# Source networking configuration.
. /etc/sysconfig/network

CATALINA_HOME=/usr/local/tomcat
TOMCAT_SCRIPT=$CATALINA_HOME/bin/catalina.sh
TOMCAT_USER=root

if [ ! -f $TOMCAT_SCRIPT ]; then
    exit 0
fi

# See how we were called.
case "$1" in
    start)
        # Start daemons.
        if [ -f /var/lock/subsys/tomcat ] ; then
            echo "Tomcat already started!"
            exit 1
        fi
        echo -n "Starting Tomcat: "
        su -s /bin/bash - $TOMCAT_USER -c "$TOMCAT_SCRIPT start"
        RETVAL=$?
        echo
        [ $RETVAL = 0 ] && touch /var/lock/subsys/tomcat
        ;;
    stop)
        # Stop daemons.
        if [ ! -f /var/lock/subsys/tomcat ] ; then
            echo "Tomcat already stopped!"
            exit 1
        fi
        echo -n "Shutting down Tomcat: "
        $TOMCAT_SCRIPT stop
        RETVAL=$?
        echo
        [ $RETVAL = 0 ] && rm -f /var/lock/subsys/tomcat
        ;;
    status)
        status tomcat
        exit $?
        ;;
    restart)
        $0 stop
        $0 start
        ;;
    *)
        echo "Usage: $TOMCAT_PROG {start|stop|status|restart}"
        exit 1
esac

exit 0

太字の箇所の設定は自身の設定に合わせてください
これでserviceコマンドからtomcatを起動することができます