読者です 読者をやめる 読者になる 読者になる

SRPMを使ったパッケージのインストール

概要

多くのRPMパッケージにはバイナリパッケージとソースパッケージが用意されています。ソースパッケージはSRPMとも呼ばれ、.src.rpmという拡張子が付けられています。

バイナリパッケージはあらかじめビルドされたパッケージであり、簡単にインストールできる反面、ライブラリのバージョンが違ったり依存関係に問題があると、正常に動作しないことがあります。その場合はソースパッケージから自分の環境に合うバイナリパッケージをリビルドして、インストールすることになります。

ここではsysstatを例に、SRPMを使ってパッケージをインストールする方法を説明します。



構成

CentOS release 5.7 (Final)
RPM バージョン 4.4.2.3



rpmbuildのインストール

SRPMからバイナリパッケージを作成するには、rpmbuildというコマンドが必要になります。まだインストールされていなければ、ここでインストールしてしまいましょう。なお、パッケージ名はrpm-buildです。

# yum install rpm-build.x86_64



SRPMのインストール

ディストリビューションにもよりますが、RedHat系のOSでは/usr/src/redhatディレクトリや/var/src/rpmディレクトリにRPMをビルドするためのディレクトリが用意されています。

# ls /usr/src/redhat/
BUILD  RPMS  SOURCES  SPECS  SRPMS

/usr/src/redhat/SRPMSディレクトリにSRPMをダウンロードします。

# wget -P /usr/src/redhat/SRPMS http://pagesperso-orange.fr/sebastien.godard/sysstat-10.0.3-1.src.rpm


方法1 SRPMから直接RPMをリビルドする

SRPMから直接RPMをリビルドします。あえてSPECファイルを編集する必要がなく、自分の環境でリビルドしたいだけであれば、こちらの方法でインストールできます。

rpmbuildコマンドを使って、SRPMからRPMをリビルドします。

# rpmbuild --rebuild /usr/src/redhat/SRPMS/sysstat-10.0.3-1.src.rpm

リビルドすると次のようなエラーメッセージが表示されることがあります。この場合、MD5チェックサムの検証をスキップする必要があるため、方法2でインストールします。

# rpmbuild --rebuild sysstat-10.0.3-1.src.rpm
sysstat-10.0.3-1.src.rpm をインストール中です。
エラー: アーカイブの伸長に失敗: ファイル /usr/src/redhat/SPECS/sysstat-10.0.3.spec;4f069b14: cpio: MD5 チェックサムが適合しません。
エラー: sysstat-10.0.3-1.src.rpm をインストールできません。

リビルドされたRPMをインストールします。

# rpm -ivh /usr/src/redhat/RPMS/x86_64/sysstat-10.0.3-1.x86_64.rpm


方法2 SRPMを展開し、SPECファイルを修正してからリビルドする

SRPMをインストールします。SOURCESディレクトリにソースコードが、SPECSディレクトリにSPECファイルが展開され、自分の環境に合わせてSPECファイルを編集できます。

# rpm -ivh /usr/src/redhat/SRPMS/sysstat-10.0.3-1.src.rpm

cpio: MD5 チェックサムが適合しません。というエラーメッセージが表示された場合は、--nomd5オプションを付けてMD5チェックサムの検証をスキップします。

# rpm -ivh --nomd5 /usr/src/redhat/SRPMS/sysstat-10.0.3-1.src.rpm

SPECファイルを修正します。

# vim /usr/src/redhat/SPECS/sysstat-10.0.3.spec

rpmbuildコマンドを使って、RPMをリビルドします。--bbオプションはバイナリパッケージのみをビルドする(ソースパッケージはビルドしない)、--cleanオプションは最後にビルドツリーを削除することを意味しています。

# rpmbuild -bb --clean /usr/src/redhat/SPECS/sysstat-10.0.3.spec

リビルド中は多くのメッセージが表示されますが、最後の方で次のようなメッセージが出力されます。これを見るとRPMの作成先を確認できます。

書き込み完了: /usr/src/redhat/RPMS/x86_64/sysstat-10.0.3-1.x86_64.rpm

リビルドされたRPMをインストールします。

# rpm -ivh /usr/src/redhat/RPMS/x86_64/sysstat-10.0.3-1.x86_64.rpm

単独のサーバーの「負荷」の正体を突き止める

指標を読む

ロードアベレージ
# uptime
 15:40:33 up 357 days, 22:34,  2 users,  load average: 0.19, 0.17, 0.12
コマンド
uptime。load averageに続く3つの数字が過去1分間、5分間、15分間の平均値を表します。
意味
処理を実行したいが、なにかしらの要因で実行を待たされているプロセスの数を表します。したがって、ロードアベレージが高い状態とは多くのプロセスが処理を実行できずに待たされている状態、ということになります。
解釈
なにかしらの要因としては「ほかのプロセスにCPUが使われていて、空くのを待っている状態」と「ディスクに読み書き要求を発行していて、その結果を待っている状態」の二種類が考えられます。前者は「CPU使用率」、後者は「I/O待ち率」として数値化することができます。ロードアベレージを見ただけでは原因を切り分けることはできないため、次にCPU負荷が高いのか、I/O負荷が高いのかの切り分けに進むことになります。一方、ロードアベレージが低い(のにスループットが上がらない)場合は、ネットワーク的な要因(パケットロスなど)を疑うことになります。


CPU使用率
# sar
Linux 2.6.18-194.32.1.el5 (rm21881198) 	2012年01月05日

00時00分01秒       CPU     %user     %nice   %system   %iowait    %steal     %idle
00時10分01秒       all      1.73      0.01      0.35      0.72      0.00     97.19
00時20分01秒       all      1.73      0.01      0.33      0.82      0.00     97.11
00時30分01秒       all      1.62      0.01      0.35      0.85      0.00     97.17
00時40分01秒       all      1.55      0.01      0.34      0.88      0.00     97.22
00時50分01秒       all      1.15      0.01      0.28      0.54      0.00     98.02
コマンド
sar
意味
%userがユーザー空間でCPUが使われた時間の割合、%systemがシステム空間でCPUが使われた時間の割合を表します。割合は百分率です。
解釈
%userが高い場合は、ユーザー空間のプロセスがCPUを消費しています。よくある要因としては「純粋にCPUパワーが必要な処理(数値計算、画像や動画の変換など)を行っている」ことや「意図しない暴走でCPUを消費している」ことが考えられます。前者はCPUをより高性能なものに交換したり、アルゴリズムを見直して処理効率を改善するといった対策が考えられます。後者は原因を突き止めて暴走を停止する必要があります。一方、%systemが高い場合は、システム空間のプロセスがCPUを消費しています。よくある要因としては「I/O待ちでCPU時間を消費している」ことや「大きめのプロセスを頻繁にforkしている」ことが考えられます。


I/O待ち率
コマンド
sar
意味
%iowaitがCPUがディスクI/Oの結果を待っていた時間の割合を表します。
解釈
%iowaitと%systemがともに高い場合は、readやwriteの応答を待ってI/O待ちが発生しています。これは、I/O待ちが発生するとreadやwriteのシステムコールに要する時間も増えるため、%systemも上昇するためです。逆に、%iowaitが高いにもかかわらず%systemが低い場合は、物理メモリ量を超えてメモリを使ってしまい、スワップが大量に発生している可能性があります。この場合は、sar -Wコマンドでスワップ頻度を、freeコマンドでメモリ使用状況を、topコマンドをメモリ使用率でソートしてメモリを消費しているプロセスを確認します。


スワップ頻度
# sar -W
Linux 2.6.18-194.32.1.el5 (rm21881198) 	2012年01月05日

00時00分01秒  pswpin/s pswpout/s
00時10分01秒      0.00      0.00
00時20分01秒      0.00      0.00
00時30分01秒      0.00      0.00
00時40分01秒      0.00      0.00
00時50分01秒      0.00      0.00
コマンド
sar -W


メモリ使用状況
# free
             total       used       free     shared    buffers     cached
Mem:      24660136   24534520     125616          0     236268   10033728
-/+ buffers/cache:   14264524   10395612
Swap:     50331636        152   50331484
コマンド
free


プロセス毎のメモリ使用率
# top
top - 15:50:42 up 357 days, 22:44,  2 users,  load average: 0.20, 0.17, 0.12
Tasks: 163 total,   1 running, 162 sleeping,   0 stopped,   0 zombie
Cpu(s):  1.2%us,  0.2%sy,  0.0%ni, 97.0%id,  1.5%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:  24660136k total, 24531064k used,   129072k free,   236352k buffers
Swap: 50331636k total,      152k used, 50331484k free, 10030204k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                              
 6516 mysql     15   0 13.9g  13g 5932 S 11.0 56.0  96039:24 mysqld                               
 3391 root      15   0  154m 8116 4100 S  0.0  0.0  22:33.12 snmpd                                
32292 ntp       15   0 19832 5528 4424 S  0.0  0.0   0:00.02 ntpd                                 
 3513 named     19   0  283m 4656 1996 S  0.0  0.0   0:20.97 named                                
 3234 haldaemo  15   0 31196 4364 1680 S  0.0  0.0   0:05.80 hald                                 
コマンド
top



原因プロセスを特定する

# ps -lp 6516
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S    27  6516  5984 22  75   0 - 3640236 725761 ?      66-16:48:21 mysqld

CPU使用率が高い場合は、topコマンドをCPU使用率でソートしてCPUを消費しているプロセスのPIDを確認し、psでプロセスの情報を表示します。STATが「R」であれば、「実行中または実行可能(だけど実行待ち)」なので、そのプロセスが原因の可能性が高いと判断できます。

I/O使用率が高い場合は、topコマンドをCPU使用率(%systemが高い場合)やメモリ使用率(%systemが低い場合)でソートしてプロセスのPIDを確認し、psでプロセスの情報を表示します。STATが「D」であれば、「割り込み不可能な待機状態(普通はI/O)」なので、そのプロセスが原因の可能性が高いと判断できます。

topコマンドの操作コマンド

M メモリ使用量が多いもの順
N プロセスID順
P CPUの使用時間率の長いもの順
R ソート順の逆転
T 実行時間が長い順
q topコマンドの終了
s 表示の更新間隔(単位は秒)
u 特定のユーザー権限のプロセスだけ

psコマンドのSTAT(ステータス)

PROCESS STATE CODES
Here are the different values that the s, stat and state output specifiers
(header "STAT" or "S") will display to describe the state of a process.
D    Uninterruptible sleep (usually IO)
R    Running or runnable (on run queue)
S    Interruptible sleep (waiting for an event to complete)
T    Stopped, either by a job control signal or because it is being traced.
W    paging (not valid since the 2.6.xx kernel)
X    dead (should never be seen)
Z    Defunct ("zombie") process, terminated but not reaped by its parent.

For BSD formats and when the stat keyword is used, additional characters may be
displayed:
<    high-priority (not nice to other users)
N    low-priority (nice to other users)
L    has pages locked into memory (for real-time and custom IO)
s    is a session leader
l    is multi-threaded (using CLONE_THREAD, like NPTL pthreads do)
+    is in the foreground process group



ロードアベレージを知る

おなじみのtopコマンドは右上にロードアベレージを表示します。

# top
top - 18:52:32 up 80 days, 15 min,  1 user,  load average: 0.58, 0.78, 0.88
Tasks: 164 total,   1 running, 163 sleeping,   0 stopped,   0 zombie
Cpu(s):  4.2%us,  0.2%sy,  0.0%ni, 95.5%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:  24659372k total, 11901752k used, 12757620k free,   302260k buffers
Swap: 50331636k total,        0k used, 50331636k free,  8835812k cached

/proc/loadavgは左から1分間、5分間、15分間の平均値、4番目が現在実行しているプロセス数/総プロセス数、5番目が最後に使用されたプロセスIDを意味します。

# cat /proc/loadavg 
1.16 0.91 0.91 3/527 28107



sarコマンドで統計情報を知る
sar -u CPU使用率を表示する
sar -b ディスクI/Oの使用状況を表示する
sar -W スワップ頻度を表示する
sar -q ロードアベレージやrunqの大きさを表示する
sar -r メモリの使用状況を表示する
sar -P {0, 1, ... | ALL} プロセッサごとに統計値を表示する
sar -f /var/log/sa/sann 日付を指定して過去の統計情報を表示する
sar -A すべての情報を表示する
# sar -u
Linux 2.6.18-274.3.1.el5 (rm25221198) 	2012年01月05日

00時00分01秒       CPU     %user     %nice   %system   %iowait    %steal     %idle
00時10分01秒       all     13.13      0.01      0.28      0.05      0.00     86.54
00時20分01秒       all     12.43      0.01      0.26      0.05      0.00     87.25
00時30分01秒       all     17.87      0.01      0.28      0.06      0.00     81.79
00時40分01秒       all     15.84      0.01      0.27      0.06      0.00     83.83
00時50分01秒       all     13.58      0.01      0.43      0.05      0.00     85.93
# sar -b
Linux 2.6.18-194.32.1.el5 (rm21881198) 	2012年01月05日

00時00分01秒       tps      rtps      wtps   bread/s   bwrtn/s
00時10分01秒    161.93     16.75    145.17    534.30   6523.02
00時20分01秒    159.18     16.17    143.01    515.57   6404.59
00時30分01秒    160.00     18.54    141.46    591.59   6130.04
00時40分01秒    141.71     12.19    129.51    388.39   5485.18
00時50分01秒    132.08     10.21    121.87    325.98   5407.91
# sar -W
Linux 2.6.18-274.3.1.el5 (rm25221198) 	2012年01月05日

00時00分01秒  pswpin/s pswpout/s
00時10分01秒      0.00      0.00
00時20分01秒      0.00      0.00
00時30分01秒      0.00      0.00
00時40分01秒      0.00      0.00
00時50分01秒      0.00      0.00
# sar -q
Linux 2.6.18-274.3.1.el5 (rm25221198) 	2012年01月05日

00時00分01秒   runq-sz  plist-sz   ldavg-1   ldavg-5  ldavg-15
00時10分01秒         4       726      0.51      0.91      1.15
00時20分01秒         4       755      1.50      1.05      1.06
00時30分01秒         1       755      1.06      1.31      1.24
00時40分01秒         0       333      1.60      1.42      1.29
00時50分01秒         0       523      1.19      1.10      1.15
# sar -r
Linux 2.6.18-274.3.1.el5 (rm25221198) 	2012年01月05日

00時00分01秒 kbmemfree kbmemused  %memused kbbuffers  kbcached kbswpfree kbswpused  %swpused  kbswpcad
00時10分01秒  13167640  11491732     46.60    301488   8467272  50331636         0      0.00         0
00時20分01秒  13157192  11502180     46.64    301492   8475636  50331636         0      0.00         0
00時30分01秒  13145024  11514348     46.69    301504   8486788  50331636         0      0.00         0
00時40分01秒  13150916  11508456     46.67    301516   8497012  50331636         0      0.00         0
00時50分01秒  13134316  11525056     46.74    301540   8505956  50331636         0      0.00         0
# sar -P ALL
Linux 2.6.18-274.3.1.el5 (rm25221198) 	2012年01月05日

00時00分01秒       CPU     %user     %nice   %system   %iowait    %steal     %idle
00時10分01秒       all     13.13      0.01      0.28      0.05      0.00     86.54
00時10分01秒         0      4.74      0.00      0.12      0.32      0.00     94.81
00時10分01秒         1     15.49      0.01      0.34      0.01      0.00     84.15
00時10分01秒         2     17.32      0.01      0.23      0.01      0.00     82.44
00時10分01秒         3     16.47      0.01      0.36      0.01      0.00     83.15
00時10分01秒         4      6.41      0.00      0.30      0.07      0.00     93.23
00時10分01秒         5     21.23      0.01      0.32      0.01      0.00     78.44
00時10分01秒         6      3.97      0.01      0.24      0.00      0.00     95.79
00時10分01秒         7     19.39      0.01      0.32      0.00      0.00     80.28
...
平均値:        CPU     %user     %nice   %system   %iowait    %steal     %idle
平均値:        all      9.13      0.01      0.21      0.04      0.00     90.61
平均値:          0      3.28      0.00      0.10      0.20      0.00     96.42
平均値:          1     11.85      0.01      0.28      0.01      0.00     87.85
平均値:          2     11.65      0.01      0.18      0.00      0.00     88.16
平均値:          3     11.98      0.01      0.28      0.00      0.00     87.72
平均値:          4      3.07      0.00      0.15      0.09      0.00     96.69
平均値:          5     14.50      0.01      0.25      0.00      0.00     85.23
平均値:          6      2.35      0.01      0.20      0.00      0.00     97.44
平均値:          7     14.37      0.01      0.28      0.00      0.00     85.34
# sar -f /var/log/sa/sa28
Linux 2.6.18-274.3.1.el5 (rm25221198) 	2011年12月28日

00時00分01秒       CPU     %user     %nice   %system   %iowait    %steal     %idle
00時10分01秒       all      5.42      0.01      0.21      0.04      0.00     94.33
00時20分01秒       all      6.49      0.01      0.20      0.04      0.00     93.26
00時30分01秒       all      5.63      0.01      0.18      0.04      0.00     94.14
00時40分01秒       all      5.51      0.01      0.18      0.04      0.00     94.26
00時50分01秒       all      5.27      0.01      0.17      0.04      0.00     94.51

Vim Cheat Sheet

編集モード

gg ファイルの先頭に移動する
G ファイルの末尾に移動する
^ カレント行の先頭の文字に移動する
0 カレント行の先頭に移動する
$ カレント行の末尾に移動する
w 次の単語の先頭に移動する
b 前の単語の先頭に移動する
W 次の空白で区切られた単語の先頭に移動する
B 前の空白で区切られた単語の先頭に移動する
cw 単語の末尾までを削除し、挿入モードに入る
dw 単語の末尾までを削除する
f○ カレント行の次の○に移動する
t○ カレント行の次の○の一文字手前に移動する
F○ カレント行の前の○に移動する
T○ カレント行の前の○の一文字手前に移動する
; 次の○に移動する
, 前の○に移動する
ct○ カレント行の次の○の一文字手前までを削除し、挿入モードに入る
dt○ カレント行の次の○の一文字手前までを削除する
Shift+} 次の空行へジャンプする
Ctrl+w, c カレントウィンドウを閉じる
Ctrl+w, Ctrl+w 次のウィンドウへ移る
Ctrl+w, n カレントウィンドウを水平分割する
Ctrl+w, h 左のウィンドウへ移る、ほかj, k, lで各方向のウィンドウへ移る
v ビジュアルモード
Shift+v 行ビジュアルモード
Ctrl+v 矩形ビジュアルモード



ビジュアルモード

iw その単語を選択する
aw その単語〜次の単語の直前までを選択する
'<,'>s/src/dst/g ビジュアルモードの選択範囲を対象にsrcをdstに全置換する
I → 入力 → ESC 行頭一括入力。矩形ビジュアルモードで範囲選択後、Iで挿入モードに入り、任意の文字列を入力後、ESCで抜ける
A → 入力 → ESC 行末一括入力。矩形ビジュアルモードで範囲選択後、Aで挿入モードに入り、任意の文字列を入力後、ESCで抜ける



挿入モード

Ctrl+{ ESC
Ctrl+h 左へカーソルを移動する、ほかj, k, lで各方向へカーソルを移動する



コマンドモード

:sp filename 水平分割してファイルを開く
:vs filename 垂直分割してファイルを開く
:e カレントバッファをリロードする
:!% カレントバッファに読み込んでいるファイルを実行する
:pwd カレントディレクトリを表示する
:cd path カレントディレクトリをpathに移動する
:cd - カレントディレクトリを直前の場所に戻す
:set encoding デフォルトのエンコーディング形式を表示する
:set fileencoding カレントバッファのエンコーディング形式を表示する(cp932, euc-jp, iso-2022-jp, utf-8
:set fileformat カレントバッファのファイル形式を表示する(unix, dos, mac
:set fileencodings エンコーディング形式を自動判別する場合の優先順位を表示する
:set fileformats ファイル形式を自動判別する場合の優先順位を表示する
:set paste ペーストモード



バッファ制御

:ls[!] バッファの一覧を表示する、!があるときはunlisted-bufferを含める
:bn[!] 次のバッファを表示する、!があるときは強制的に切り替える
:bp[!] 前のバッファを表示する、!があるときは強制的に切り替える
:b[!]7 バッファ番号7のバッファを表示する、!があるときは強制的に切り替える
:7b[!] ~
:bw[!] カレントバッファを閉じる、!があるときは変更を破棄する
:bd[elete][!] カレントバッファをunlisted-bufferにする、!があるときは変更を破棄する



検索・置換

:%s/src/dst/g すべてのsrcをdstに置換する
:10,30s/src/dst/g 10行目〜30行目までのsrcをdstに置換する
:%s/copy \(.*\)$/copy \1 \1/ ホールドバッファ、\(〜\)で囲まれた部分を\1〜\9で呼び出す
:noh 検索結果のマークアップを消す
Ctrl+r, / 直前の検索文字列を呼び出す



内部grep

:vimgrep /hogehoge/j **/*.rb | cw
hogehoge 検索条件(正規表現
j マッチしたファイルへ自動的にジャンプしない
** 再帰的に検索
*.rb 検索対象(ワイルドカード可)
| cw マッチしたファイルがあればQuickFixを開く



surround.vim

cs"' "..."を'...'に置換する
cs") "..."を(...)に置換する
cs"( "..."を( ... )に置換する
yss' カレント行を'で囲む
ys$' 行末までを'で囲む
ysw' 単語の末尾までを'で囲む
ysf?' カレント行の次の?までを'で囲む
yst?' カレント行の次の?の一文字手前(それが空白なら、空白以外の文字まで遡る)までを'で囲む
ds" "..."を...に置換する



rails.vim

gf カーソルポジションの記述に対応するファイルに移動する
[f 代替ファイルに移動する
]f 関連ファイルに移動する



Compiler Plugin

:comp コンパイラの一覧を表示する
:comp ruby カレントバッファのコンパイラRubyにする
:comp! ruby すべてのバッファのコンパイラRubyにする
:make % カレントバッファに読み込んでいるファイルをコンパイルする
:make % -c Ruby、文法チェックのみ



QuickFix

:copen QuickFixを開く
:ccl QuickFixを閉じる
:clist エラーリストを表示する
:cn 次のエラー箇所へジャンプする
:cN 前のエラー箇所へジャンプする
:cp ~



MiniBufExplorer

Ctrl+k MiniBufExplorerへ移る
Ctrl+j 元のウィンドウへ戻る

cURLを使ったファイルのアップロード

構成

CentOS release 5.6 (Final)
cURL 7.15.5 (x86_64-redhat-linux-gnu)



ファイルのアップロード

例としてHTTPを取り上げていますが、FTP / FTPS / SFTP / SCPについても同様です。
HTTPを使うときはHTTPサーバーがPUTを許容するように設定されている必要があります。


fromfileをtofileという名前でアップロードします。

curl -T fromfile --user myuser:mypasswd http://www.upload.com/tofile

リモートのファイル名を省略すると、ローカルのファイル名と同じ名前が使われます。

curl -T fromfile --user myuser:mypasswd http://www.upload.com/

ローカルのファイル名の代わりに-を指定すると、アップロードするデータを標準入力から受け取ります。

cat fromfile | curl -T - --user myuser:mypasswd http://www.upload.com/tofile

fromfileをtofileに追記する形でアップロードします。

curl -T fromfile -a --user myuser:mypasswd http://www.upload.com/tofile



Memcacheのstatsコマンド

概要

Memcacheのstatsコマンドでどんな情報を表示できるのか、というメモ。



構成

CentOS release 5.5 (Final)
memcached version 1.4.5



statsコマンドで表示できる情報

項目名 説明
pid プロセスID 18622
uptime memcachedの稼働時間(秒) 10699178
time 現在時刻のタイムスタンプ(unixtime) 1324433164
version memcachedのバージョン version 1.4.5
pointer_size ホストOSのポインタサイズ(32bit or 64bit) 64
rusage_user プロセスがユーザモードで動作した累積時間(秒.マイクロ秒) 1463.871486
rusage_system プロセスがカーネルモードで動作した累積時間(秒.マイクロ秒) 4130.430135
curr_connections 現在開いているコネクション数 219
total_connections memcachedの起動から現在までに開いた累積コネクション数 49976
connection_structures memcachedが確保したコネクション構造体の数 491
cmd_get GETコマンドの累積発行数 10981050700
cmd_set SETコマンドの累積発行数 396173398
cmd_flush FLUSH_ALLコマンドの累積発行数 0
get_hits GETコマンドがキーにhitした回数 10472095896
get_misses GETコマンドがキーにhitしなかった回数 508954804
delete_misses DELETEコマンドがキーにhitした回数 289095120
delete_hits DELETEコマンドがキーにhitした回数 221893296
incr_misses INCRコマンドがキーにhitしなかった回数 0
incr_hits INCRコマンドがキーにhitした回数 0
decr_misses DECRコマンドがキーにhitしなかった回数 0
decr_hits DECRコマンドがキーにhitした回数 0
cas_misses リクエスト後に値が変更されたため、CASコマンドが失敗した回数? 0
cas_hits CASコマンドが成功した回数 0
cas_badval CAS値が正しくないため、CASコマンドが失敗した回数?*1 0
auth_cmds 現在実行中の認証コマンドの数 0
auth_errors クライアントが認証に失敗した回数 0
bytes_read ネットワークから受信したバイト数 1462324829248
bytes_written ネットワークへ送信したバイト数 11540854811513
limit_maxbytes 使用可能な最大メモリ容量(バイト) 3006267392
accepting_conns 1
listen_disabled_num コネクション数の不足によりmemcachedから切断されたコネクション数 0
threads リクエスト当たりに動作するワーカースレッドの数 4
conn_yields クライアントがイベント当たりの最大リクエスト回数に達した回数 0
bytes 現在使用中のメモリ容量(バイト) 2178132166
curr_items 現在格納中のアイテム数 13427957
total_items memcachedの起動から現在までに格納した累積アイテム数 396173398
evictions メモリ容量の不足によりmemcachedから追い出されたアイテム数 0
reclaimed 期限切れになったアイテムの領域を再利用した回数 60654276



statsコマンドの表示例

$ telnet localhost 11211
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
stats
STAT pid 18622
STAT uptime 10699178
STAT time 1324433164
STAT version 1.4.5
STAT pointer_size 64
STAT rusage_user 1463.871486
STAT rusage_system 4130.430135
STAT curr_connections 219
STAT total_connections 49976
STAT connection_structures 491
STAT cmd_get 10981050700
STAT cmd_set 396173398
STAT cmd_flush 0
STAT get_hits 10472095896
STAT get_misses 508954804
STAT delete_misses 289095120
STAT delete_hits 221893296
STAT incr_misses 0
STAT incr_hits 0
STAT decr_misses 0
STAT decr_hits 0
STAT cas_misses 0
STAT cas_hits 0
STAT cas_badval 0
STAT auth_cmds 0
STAT auth_errors 0
STAT bytes_read 1462324829248
STAT bytes_written 11540854811513
STAT limit_maxbytes 3006267392
STAT accepting_conns 1
STAT listen_disabled_num 0
STAT threads 4
STAT conn_yields 0
STAT bytes 2178132166
STAT curr_items 13427957
STAT total_items 396173398
STAT evictions 0
STAT reclaimed 60654276
END



stats settingsコマンドの表示例

stats settings
STAT maxbytes 3006267392
STAT maxconns 1024
STAT tcpport 11211
STAT udpport 11211
STAT inter NULL
STAT verbosity 0
STAT oldest 0
STAT evictions on
STAT domain_socket NULL
STAT umask 700
STAT growth_factor 1.25
STAT chunk_size 48
STAT num_threads 4
STAT stat_key_prefix :
STAT detail_enabled no
STAT reqs_per_event 20
STAT cas_enabled yes
STAT tcp_backlog 1024
STAT binding_protocol auto-negotiate
STAT auth_enabled_sasl no
STAT item_size_max 1048576
END



*1:2011-12-21現在、cas関係の3つの変数(cas_misses, cas_hits, cas_badval)にはすべて0が格納されています。

net.core.somaxconnについて調べてみた

概要

memcachedtcp_backlogのデフォルト値は1024で、stats settingsにも1024と表示されているのですが、

stats settings
...
STAT tcp_backlog 1024
...
END

↓ net.core.somaxconnがデフォルト値のままだと128に切り詰められてしまい、

# cat /proc/sys/net/core/somaxconn 
128

負荷が高いサーバーでは接続要求を取りこぼしてしまうことがあるそうです。

このnet.core.somaxconn、MemcacheやMySQLなど、高負荷時に多くの接続要求を受け付けるサーバーではチューニングが必要なカーネルパラメータのようです。いったいどういう値なのか、調べてみました。



net.core.somaxconnとは

TCPソケットはlisten()関数の第二引数 backlog に指定した数の、完全に確率された接続要求*1を待ち受けることができるキューを作成します。キューがいっぱいになった状態で新たに接続要求を受け取ると、サーバーはECONNREFUSEDを返します。下位層のプロトコルが再送信をサポートしていれば、ECONNREFUSEDは無視され、リトライが成功するかもしれません。

net.core.somaxconnはTCPソケットが受け付けた接続要求を格納する、キューの最大長です。backlog > net.core.somaxconnのとき、キューの大きさは暗黙にnet.core.somaxconnに切り詰められます。



net.core.somaxconnの影響

net.core.somaxconnはOSレベルの接続キューの最大長として、TCPソケットで待ち受けるサービス全般に影響を与えます。具体的には、アプリケーションレベルで指定した接続キューの最大長 > net.core.somaxconnの場合、接続キューの大きさは暗黙にnet.core.somaxconnに切り詰められている可能性があります。

最大数には、1から2147483647までを指定できます。
本ディレクティブの設定値は、MaxClientsディレクティブで設定したクライアントの同時接続数よりも多くの接続要求があった場合に、Linuxシステム内にキューイングされる数として有効となります。
本ディレクティブの設定値がLinuxシステムに設定されている待機中TCPコネクションの最大値(/proc/sys/net/core/somaxconn)よりも大きい場合は、待機中TCPコネクションの最大値が有効となります。
Linuxシステムに設定されている待機中TCPコネクションの最大値を確認する場合は、sysctlコマンドを使用して以下のように実行してください。
/sbin/sysctl -n net.core.somaxconn

http://software.fujitsu.com/jp/manual/manualfiles/M080179/B1WN9491/05Z202/ihsaa/ihs00123.htm



net.core.somaxconnの確認

# sysctl net.core.somaxconn
net.core.somaxconn = 128



net.core.somaxconnの変更

sysctlコマンドを使う

sysctlコマンドを使うと、簡単に書き換えることができます。

# sysctl -w net.core.somaxconn=1024

しかし、これだけではリブートすると元に戻ってしまいます。元に戻らないようにするにはsysctl.confを書き換えます。


sysctl.confを書き換える

リブートしても元に戻らないように、sysctl.confを書き換えます。

FILE: /etc/sysctl.conf

--- /etc/sysctl.conf	2011-12-21 16:02:57.000000000 +0900
+++ /etc/sysctl.conf	2011-12-21 16:06:14.000000000 +0900
@@ -39,3 +39,6 @@ xen.independent_wallclock = 1
 
 # xen ntp
 xen.independent_wallclock = 1
+
+# Increase number of incoming connections backlog
+net.core.somaxconn = 1024

sysctlコマンドを使ってsysctl.confをリロードできます。

# sysctl -p



*1:以前は不完全な接続要求でしたが、Linux 2.2で完全な接続要求に変更されました。不完全な接続要求を待ち受ける数はtcp_max_syn_backlogを用いて設定します。

トラブルシューティングでよく使うコマンド<各種サービス編>

Unicornが8080ポートへのHTTPリクエストにレスポンスしていることを確認したい

localhostの8080ポートに、/helpsを要求するGETリクエストを送信します。Unicornが8080ポートをlistenしていれば、レスポンスとして/helpsの内容が返ってきます。

$ curl http://localhost:8080/helps