supermicro 3012X3-A12W-R3にメモリ増設した際のめも
ECCメモリエラー発生
以下のメモリを4枚差しで8GBにしたころCentOS5.6の起動時にエラーが発生
Kingston 2GB 800MHz DDR2 ECC CL5 DIMM KVR800D2E5/2G
LOG
May 6 14:38:09 xxx kernel: EDAC MC0: UE page 0x0, offset 0x0, grain 1073741824, row 2, labels ":": i3200 UE
OS事体は起動しているが画面に出力し続ける。~
メッセージの内容としては修復不能なエラーが発生したときに出るメッセージの模様
・やったこと
MEM86+では2PASS確認済み。
BIOSのLOG確認→メモリエラーは出ていない。BIOS画面では正常に認識。
メモリ全て一度抜き差し→状況変わらず。
一枚ずつ抜いて起動テスト→DIMM0のみ差している場合はエラーが出ない。
4枚のメモリをDIMM0にそれぞれ差して起動テスト→エラーなし。
DIMM0に刺さっている状態でDIMM1~DIMM3にそれぞれ一枚ずつ差して起動テスト→同じエラー発生。
上記から、メモリ自体の問題ではなくOS側の処理の問題の可能性が高いとみた。
・bugzillaトピックがあった。~
https://bugzilla.redhat.com/show_bug.cgi?id=564274~
4GB以上になるとEDACというモジュールがフェイクエラーを出すバグの模様~
特定のBIOSとカーネルモジュールの組み合わせで発生するとのこと。~
解決するには
Some i3210 BIOSes have problems enabling the hardware checks at the MCU. On those hardware, customers should try to disable Quickboot and/or"Memory Remap Feature" or to disable EDAC drivers
で行けるらしい。~
今回のsupermicroに
"Quickboot" "Memory Remap Feature"は無いので
"disable EDAC drivers"
で行くことにした。
edacが有効なときの表示。無効にするとこれが出なくなるはず。
# lsmod | grep edac i3200_edac 38865 0 edac_mc 60449 1 i3200_edac
無効にするにはブラックリストに下記を追加してOSを再起動
/etc/modprobe.d/blacklist: blacklist i3200_edac
上記ファイルがない場合はblacklist.confに記載する~
再起動後確認
# lsmod | grep edac
何もでない。エラーも出なくなった。
そもそもEDACてなに?て人は [#ff516434]
現象
RHEL4および5では、EDAC (Error Detection and Correction)という仕組みが実装されて おり、これによりハードウェアエラーをOSから取得することができます。しかし、この機能を有効にした場合は、RSA II(リモート管理アダプターII)もしくはBladeCenter MM/aMM(管理モジュール/アドバンスト管理モジュール)によるエラー検知を正しく行うことができません。
原因
LinuxのEDAC (Error Detection and Correction) は、Linux上からハードウェアエラーを取得する仕組みで、現在の実装ではメモリのECCエラーなどを検知し、OSのログに記録することができます。 /var/log/messages出力例 Oct 5 13:49:44 kernel: EDAC k8 MC0: general bus error: participating processor (local node response), time-out(no timeout) memory transaction type (generic read), mem or i/o (mem access), cache level (generic) Oct 5 13:49:44 kernel: MC0: CE page 0x391c3, offset 0xee0, grain 8, syndrome 0xa3b8, row 0, channel 1, label "": k8_edac Oct 5 13:49:44 kernel: MC0: CE - no information available: k8_edac Error Overflow set
Linux EDACは、現在のところ
1. 毎秒エラー情報を確認するため、システムの負荷が高い 2. チップセットのレジスターからエラー情報を読んだあと、カウンターをゼロにリセットする という動きになっており、2. のために、RSA IIやMM/aMMによるイベントログが正しく記 録できません。
引用元
http://www-06.ibm.com/jp/domino01/mkt/cnpages7.nsf/page/default-0010EE4A
mysqldumpslow
mysqlのslow.logを読み取って集計してくれるtool
使い方
mysqldumpslow slow.log > result.txt
詳細はhelpで確認
mysqldumpslow --help Usage: mysqldumpslow [ OPTS... ] [ LOGS... ] Parse and summarize the MySQL slow query log. Options are --verbose verbose --debug debug --help write this text to standard output -v verbose -d debug -s ORDER what to sort by (t, at, l, al, r, ar etc), 'at' is default -r reverse the sort order (largest last instead of first) -t NUM just show the top n queries -a don't abstract all numbers to N and strings to 'S' -n NUM abstract numbers with at least n digits within names -g PATTERN grep: only consider stmts that include this string -h HOSTNAME hostname of db server for *-slow.log filename (can be wildcard), default is '*', i.e. match all -i NAME name of server instance (if using mysql.server startup script) -l don't subtract lock time from total time
supersmackを使ったMysqlベンチマーク
supersmackはリモートでmysqlにログインしてテストデータに対して、~
同時接続数や試行回数を指定してSQLは発行して処理時間などを図ることのできるツール~
テストデータはパッケージに含まれているコマンドgen-dataで作成できる~
注意点
supersmack自体の負荷が結構高いのでベンチ対象とは違うサーバで実行しよう
インストール
wget http://vegan.net/tony/supersmack/super-smack-1.3.tar.gz tar super-smack-1.3.tar.gz tar xvzf super-smack-1.3.tar.gz cd super-smack-1.3 ./configure --with-mysql --prefix=$HOME --with-smacks-dir=$HOME/share --with-datadir=$HOME/var make make install
テストデータの作成
gen-data -n 90000 -f %12-12s%n,%25-25s,%n,%d > /tmp/words.dat~
オプション
-n データ行数を指定 -f データフォーマットを指定(カンマ区切り) s 文字列(上記の場合、%12-12で12文字に制限、などの指定が可能) d ランダムな整数値 n 1,2,3,…と単調増加する整数値
中身はこんな感じのが90000行ある
mhokdtjblikw89957,wqatcqwwrgtnlwksnekbncnrv,89957,1141375699 ukjfhiyjdbac89958,xrirhtqtmexahmcueavbkgjro,89958,1002925258 dtldvlwgfgbv89959,bpabrknthtuevfmhadpdxbjvo,89959,1748561933 dtrgpuxrvqck89960,mkghqcpdlrgbwgeifstkmlqeg,89960,77060791 wehbounveeav89961,jmpspnywxgprqffhjnygsikjd,89961,790607123
Mysqlの設定 [#h6aba7f9]
>grant select,insert,update,delete on *.* to bench@[hostname] identified by 'passwd';
テスト用テーブルの作成
>CREATE TABLE test.http_auth (username char(255) not null primary key, pass char(25), uid integer, gid integer);
テストデータをインポート
>LOAD DATA LOCAL INFILE '/tmp/words.dat' INTO TABLE test.http_auth FIELDS TERMINATED BY ',';
※LOCALつけるのを忘れるとインポートできないことがあるので注意
supersmackの設定 [#k117ec5d]
supersmackの設定ファイルを修正する
vim /root/share/select-key.smack
実行するための修正点は以下のところ
ベンチ対象の情報を記載する。~
4 user "bench"; 5 host "172.16.50.17"; 6 db "test"; 7 pass "passwd"; 64 user "bench"; // connect as this user 65 pass "passwd"; // use this password 66 host "172.16.50.17"; // connect to this host 67 db "test"; // switch to this database
ベンチマーク実行
下記は設定した内容で同時接続数10、試行回数10でベンチを取っている
# super-smack /root/share/select-key.smack2 10 10
実行結果は以下のように出る
Query Barrel Report for client smacker1 connect: max=7ms min=1ms avg= 4ms from 10 clients Query_type num_queries max_time min_time q_per_s select_index 200 42 0 286.40
そのほか細かい設定はselect-key.smackファイルの以下のディレクティブで指定できる。
12 // ensure the table exists and meets the conditions 34 //define a dictionary 47 //define a query
shell関連memo
キーボードショートカット
- 「Ctrl」+「S」でキー入力が受け付けられなくなる~
「Ctrl」+「Q」で解除
配列について [#k96b8e7a]
要素の参照
${array[0]} ${array[1]}
要素の代入
array[0]=1 array[0]=2
配列の要素の個数
declare -i array_num=${#array[@]}
配列の操作
declare -a array=(1 2 3)
先頭を取り出す
first="${array[0]}" # firstは1 array=("${array[@]:1}") # arrayは(2 3)
先頭に追加
array=(5 "${array[@]}") # arrayは(5 2 3)
末尾を取り出す
declare -i num=${#array[@]}-1 last="${array[$num]}" # lastは3 array=("${array[@]:0:$num}") # arrayは(5 2)
末尾に追加
array=("${array[@]}" 9) # arrayは(5 2 9)
lsof 使い方 [#z2b7b1b0]
lsof - list open files
- pオプションでプロセスID指定
# プロセスID指定
lsof -p 12345
#バッククォート使う
>||
lsof -p `pgrep -n httpd`
|
- cオプションでプロセス名指定
lsof -c httpd
\-uオプションでユーザ指定
lsof -u hoge
- iオプション [@IPアドレス:ポート番号]
listenしてるポートを出力。指定したポートのみ表示することもできる。
lsof -i # Listenしてるのずらずら表示 lsof -i :22 # ssh lsof -i :22,80 # ssh or http lsof -i :http # 名前でもいける lsof -i @192.168.0.1 # interface指定 lsof -i @192.168.0.1:80 # interfaceとポート指定
- aオプションでAND
オプション複数指定するとORで出力されるようです。なのでプロセスとユーザの両方を指定したいときは-aをつける。
lsof -a -u hoge -c java
ファイルシステムを指定
オプションなしでファイルシステム(ディレクトリ、ファイル)を指定すると、そのファイルシステムを使用中のプロセスが出てきます。例えば、こんなときに使う。(パスは絶対パスで指定する必要あり)
root # umount /media/cdrom umount: /media/cdrom0: デバイスを使用中です umount: /media/cdrom0: デバイスを使用中です
split 使い方 [#f9701890]
ファイルのサイズが大きくてメディアに収まりきれないときに使うとよい
split -b 1000m file file. ←fileをを1GBbytesずつに分割
くっつけるとき
cat file1 file2 > file
tar: Removing leading `/' from member names
メッセージが出た時の対処方法
tarは基本的に相対パスで実行される。~
そのため絶対パスで指定された場合に警告が出る。~
(圧縮自体は問題なし)~
絶対パスをで進めたい場合は-Pオプションを付けて実行すればよい
ハードウェア情報を調べるコマンド
dmidecode~
例:メモリの情報を抽出する
# dmidecode --type memory
typeはいろいろ
bios system baseboard chassis processor memory connector slot
引数を付けないでやると全部出るのでgrepしてもよし。~
/proc/meminfo とかよりも詳細な情報がでることもあるのでいろいろ試してみよう
文字コード変換
iconv
iconv -f=utf8 -t=sjis < 元ファイル > 変換後ファイル名
元ファイルの文字コードを utf8 とみなし、Shift_JIS に変換して出力。
iconv --list
-e 変換結果をEUC-JPで出力する
-j 変換結果をISO-2022-JPで出力する
-s 変換結果をShift-JISで出力する
-u 変換結果のバッファリングを行わない
|
DISKの追加とか
mkfs -t ext3 /dev/sda2 mkdir -p /disk2 mount -t ext3 /dev/sda1 /disk2
引用元
http://saminnet.dip.jp/servercomputer/Lmemo/pub/boot_scsi.html~
http://d.hatena.ne.jp/interu/20081215/1229336594
DISKの速度を調べる
hdparm -ft /dev/mapper/VolGroup00-LogVol00
プロセスごとのDISK I/Oを調べる
iotop
- d で間隔指定~
方向キーで優先順位の変更ができる~
インストールされていない場合はepelからyumで入れる
wgetやscpに帯域制限をかける
wget
・--limit-rateのオプションで制御可能。単位はbyte/秒
wget --limit-rate=100000 http://XXXXXX.com/aaa.tgz
これで100KB/秒で転送。
scp
・-lオプションで制御可能。単位はKbit/秒
scp -l 800 root@XXXXXX.com:/aaa/aaa.tgz ./
|
これで100KB/秒で転送。
rsync
・--bwlimitオプションで制御可能。単位はKbyte/秒
rsync -av --bwlimit=200 root@XXXXXX.com:/aaa/ ./aaa/
これで200KB/秒で転送。
faillog [#g29302b0]
ログイン失敗をみるコマンド~
/var/log/faillog~
を整形して表示する~
使用例~
ユーザーを指定して確認
faillog -u test
全ユーザーを指定して確認
faillog -a
yum [#s5217740]
- 失敗して壊れた時の対応
yumやRPM中にシャットダウンなどすると以下のようなメッセージが表示され正常に起動しなくなる。
rpmdb: PANIC: fatal region error detected; run recovery エラー: db4 error(-30978) from dbenv->
復旧するには以下のファイルを削除するか移動する
# ls -l /var/lib/rpm/__db.00? -rw-r--r-- 1 rpm rpm 90112 11月 14 19:51 Sigmd5 -rw-r--r-- 1 rpm rpm 12288 11月 14 19:50 Triggername -rw-r--r-- 1 root root 16384 12月 5 09:02 __db.001 -rw-r--r-- 1 root root 1318912 12月 5 09:02 __db.002 -rw-r--r-- 1 root root 450560 12月 5 09:02 __db.003
# mv /var/lib/rpm/__db.00? /tmp
rpmを再ビルド
>||
# rpm --rebuilddb
|
yumを起動して動作確認する
sar [#t4c985de]
- 過去分を日付指定でみる
sar -f /var/log/sa/sa15
※最後は日付をmmで記載
いつも通り他のオプションの指定も可能(-r -u -qとか)
unmount できないとき [#o47e3b75]
busyとでてumountができない時がある。その際はオプションに -l を付けてやるとできることが多い
umount -l /mnt
find [#md4aac68]
検索、表示する階層を指定する。
-maxdepth [arg]
上から[arg]分の階層を除外
-maxdepth [arg]
下から[arg]分の階層を除外
find /tmp/ -maxdepth 2 -mindepth 1 -ctime -1
dateコマンドのGNU版とBSD版の違い [#x4ec59c4]
BSD版 [#mf61b295]
$ date -help date: illegal option -- h usage: date [-jnu] [-d dst] [-r seconds] [-t west] [-v[+|-]val[ymwdHMS]] ... [-f fmt date | [[[[[cc]yy]mm]dd]HH]MM[.ss]] [+format]
GNU版 [#pddc4c4e]
$ date --help 使用法: date [OPTION]... [+FORMAT] または: date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]] Display the current time in the given FORMAT, or set the system date. -d, --date=STRING display time described by STRING, not `now' -f, --file=DATEFILE like --date once for each line of DATEFILE -I[TIMESPEC], --iso-8601[=TIMESPEC] output date/time in ISO 8601 format. TIMESPEC=`date' for date only (the default), `hours', `minutes', `seconds', or `ns' for date and time to the indicated precision. -r, --reference=FILE FILE の最終変更時刻を表示する -R, --rfc-2822 RFC 2822 形式で日付と時刻を出力する 例: Mon, 07 Aug 2006 12:34:56 -0600 --rfc-3339=TIMESPEC RFC 3339 形式で日付と時刻を出力する TIMESPEC=`date', `seconds' または `ns' で 示す日付、時刻の精度になる。 日付と時刻は単一のスペースで区切られ、次 のようになる: 2006-08-07 12:34:56-06:00 -s, --set=STRING STRING で記述される時間に設定する -u, --utc, --universal UTC (協定世界時) 時間を表示または設定する --help この使い方を表示して終了する --version バージョン情報を表示して終了する ||< ***日付指定する場合 [#a19cf1a1] 10日前 BSD版 >|| date -v-10d
GNU版
date -d '10 days ago'
dnsmasqめも
簡易DNS,dhcpサーバとして使えるようだ。
今回はローカルのdnsキャッシュサーバとして試してみる。
インストール
CentOS5.8ならyumで入った。 # yum install dnsmasq
設定
今回はローカルで試すので下記を記載。 # vim /etc/resolv.conf nameserver 127.0.0.1 #先頭に追加
起動
#/etc/init.d/dnsmasq start
動作状況の確認
そのままだとLOGが出ないのでkillコマンドでSIGUSR1シグナルを送る
# pgrep dnsmasq | xargs kill -s 10 # less /var/log/messages Feb 13 15:50:17 xxx dnsmasq[20395]: time 1360738217 Feb 13 15:50:17 xxx dnsmasq[20395]: cache size 150, 0/16 cache insertions re-used unexpired cache entries. Feb 13 15:50:17 xxx dnsmasq[20395]: queries forwarded 10, queries answered locally 20 Feb 13 15:50:17 xxx dnsmasq[20395]: server 8.8.8.8#53: queries sent 1, retried or failed 0 Feb 13 15:50:17 xxx dnsmasq[20395]: server 8.8.4.4#53: queries sent 10, retried or failed 0
適当に同じドメインを何回か正引きしてから試してみるとlocalでの解決が増えていることがわかる。
Feb 13 15:54:14 xxx dnsmasq[20395]: time 1360738454 Feb 13 15:54:14 xxx dnsmasq[20395]: cache size 150, 0/17 cache insertions re-used unexpired cache entries. Feb 13 15:54:14 xxx dnsmasq[20395]: queries forwarded 11, queries answered locally 38 Feb 13 15:54:14 xxx dnsmasq[20395]: server 8.8.8.8#53: queries sent 1, retried or failed 0 Feb 13 15:54:14 xxx dnsmasq[20395]: server 8.8.4.4#53: queries sent 11, retried or failed
比べてみる
各項目ごとに以下のコマンドを叩いて時間を測ってみる
$ time for count in {1..1000}; do dig teketeke55.hatenablog.com ; done
外部DNSのみ(8.8.8.8)
real 0m21.592s
nscd有効(キャッシュにのせたあと)
real 0m9.687s
dnsmasq有効(キャッシュにのせたあと)
real 0m5.852s
上記の中ではdnsmasqが一番はやかった。