teketeke_55の日記

技術メモとか

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

本家
http://buttersideup.com/edacwiki/Main_Page

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]

ベンチ対象でmysqlにてベンチマーク用のユーザを作成する

 >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

参考:http://www.thinkit.co.jp/cert/article/0707/2/2/2.htm

shell関連memo

キーボードショートカット

  • 「Ctrl」+「S」でキー入力が受け付けられなくなる~

「Ctrl」+「Q」で解除

bashスクリプト内のインクリメント、デクリメント

他の言語のように++num などが使えないのでlet関数を使う

 let ++num
 let --num

配列について [#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

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

⇒ 使用可能な文字コード一覧を表示 (GNU の iconv で確認)

nkf

nkf -e 元ファイル > 変換後ファイル名
|

-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/秒で転送。

引用元:http://d.hatena.ne.jp/isher/20080817/1218996948

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

awk [#y47ec4ac]

後ろから取り出すにはNFを使う

 awk '{print $(NF -3)}' ※後ろから3番目のフィールドをprint

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が一番はやかった。