Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

サーバ異常検知入門

15,062 views

Published on

サーバ異常検知入門

  1. 1. サーバ異常検知~入門~<br />2011.09.24<br />@mangantempy<br />
  2. 2. 自己紹介<br />ID : @mangantempy<br />職業: Webエンジニア<br />時系列分析 勉強中<br />最近ハマってるもの:Arduino<br />
  3. 3. アジェンダ<br />なにするの?<br />サーバの監視方法<br />サンプルデータの作成<br />Rで分析<br />まとめ<br />
  4. 4. なにするの?<br />CPUやネットワーク、メモリ、ディスクなどの<br /> サーバから得られるシステム情報を分析し、<br /> 異常を検知or予測することで<br /> 早期or事前に対応可能にします。<br />分析結果<br />システム情報<br />早期対応<br />
  5. 5. サーバ監視の方法(基本)<br />UNIX系のサーバで使える基本的なコマンド<br />top…CPU、メモリの利用率、プロセスの稼動状況など<br />iostat…デバイスのI/O性能<br />free…メモリとスワップ<br />df…ディスクの使用状況<br />ifconfig…ネットワーク情報。トラフィック量エラーパケット数など<br />netstat…ネットワーク統計や状態<br />ping…ネットワークの疎通確認<br />
  6. 6. サーバ監視の方法(sysstat)<br />sysstat(通称sar)が便利なのでオヌヌヌ!<br />色々なシステム情報をまとめて管理<br />送信/受信パケットに関する情報<br />エラーパケットなどに関する情報<br />CPU使用状況<br />ディスクI/Oの使用状況<br />メモリとスワップの使用状況<br />秒当たりのスワップイン/アウト処理情報<br />定期的に情報を取得してファイルに保存<br /> ->過去に遡って調べられる<br />
  7. 7. サンプルデータの作成<br />「df」コマンドを使用します。<br />$ df<br />Filesystem 1K-ブロック 使用 使用可 使用% マウント位置<br />/dev/vzfs 83886080 4738368 79147712 6% /<br />none 262144 4 262140 1% /dev<br />
  8. 8. こんな感じのシェルスクリプトを作って<br />#!/bin/bash<br />datetime=`date ‘+%F %H:%M’`# 日付<br />values=`df | awk‘//dev/vzfs/ {print $2“,”$3“,”$4}’`# 観測値<br />echo $datetime,$values# まとめて出力<br />cronで定期的に動かして、ログに保存<br />$ crontab -l<br />* * * * * ~/df.sh >> ~/df.log 2> /dev/null<br />最初にヘッダを入れておくと良いかも<br />$echo "datetime,blocks,used,available" > ~/df.log<br />
  9. 9. でかいファイルを作る適当なバッチを動かしておく<br />結果はこんな感じ<br />$ cat ~/df.log<br />datetime,blocks,used,available<br />2011-09-24 06:06,83886080,4738280,79147800<br />2011-09-24 06:07,83886080,4738272,79147808<br />2011-09-24 06:08,83886080,4738280,79147800<br />2011-09-24 06:09,83886080,4738284,79147796<br />2011-09-24 06:10,83886080,4738296,79147784<br />2011-09-24 06:11,83886080,4738280,79147800<br />2011-09-24 06:12,83886080,5787884,78098196<br />2011-09-24 06:13,83886080,6837488,77048592<br />2011-09-24 06:14,83886080,7887092,75998988<br />2011-09-24 06:15,83886080,8936696,74949384<br />2011-09-24 06:16,83886080,11035904,72850176<br />2011-09-24 06:17,83886080,12085508,71800572<br />2011-09-24 06:18,83886080,13135112,70750968<br /> : (以下略)<br />
  10. 10. Rで分析<br />CSVデータを読み込む<br />> df.dataframe <- read.csv("df.log")<br />> head(df.dataframe)<br />datetime blocks used available<br />1 2011-09-24 06:06 83886080 4738280 79147800<br />2 2011-09-24 06:07 83886080 4738272 79147808<br />3 2011-09-24 06:08 83886080 4738280 79147800<br />4 2011-09-24 06:09 83886080 4738284 79147796<br />5 2011-09-24 06:10 83886080 4738296 79147784<br />6 2011-09-24 06:11 83886080 4738280 79147800<br />
  11. 11. 日時を行の名前にする<br />> rownames(df.dataframe) <- df.dataframe$datetime<br />> df.dataframe$datetime <- NULL<br />> head(df.dataframe)<br /> blocks used available<br />2011-09-24 06:06 83886080 4738280 79147800<br />2011-09-24 06:07 83886080 4738272 79147808<br />2011-09-24 06:08 83886080 4738280 79147800<br />2011-09-24 06:09 83886080 4738284 79147796<br />2011-09-24 06:10 83886080 4738296 79147784<br />2011-09-24 06:11 83886080 4738280 79147800<br />
  12. 12. Xtsオブジェクトに変換<br />> install.packages("xts")<br />> library(xts)<br />> df <- as.xts(df.dataframe)<br />> head(df)<br /> blocks used available<br />2011-09-24 06:06:00 83886080 4738280 79147800<br />2011-09-24 06:07:00 83886080 4738272 79147808<br />2011-09-24 06:08:00 83886080 4738280 79147800<br />2011-09-24 06:09:00 83886080 4738284 79147796<br />2011-09-24 06:10:00 83886080 4738296 79147784<br />2011-09-24 06:11:00 83886080 4738280 79147800<br />> ( start <- start(df) )<br />[1] "2011-09-24 06:06:00 JST"<br />> ( end <- end(df) )<br />[1] "2011-09-24 06:24:00 JST"<br />
  13. 13. 散布図<br />> plot(df$used)<br />
  14. 14. ある区間のデータを抜き出す<br />> df2 <- df['2011-09-24 06:11:00::']<br />> head(df2)<br /> blocks used available<br />2011-09-24 06:11:00 83886080 4738280 79147800<br />2011-09-24 06:12:00 83886080 5787884 78098196<br />2011-09-24 06:13:00 83886080 6837488 77048592<br />2011-09-24 06:14:00 83886080 7887092 75998988<br />2011-09-24 06:15:00 83886080 8936696 74949384<br />2011-09-24 06:16:00 83886080 11035904 72850176<br />> start(df2)<br />[1] "2011-09-24 06:11:00 JST"<br />> end(df2)<br />[1] "2011-09-24 06:24:00 JST"<br />
  15. 15. 回帰分析<br />> fit <- lm(df2$used~index(df2))<br />> summary(fit)<br />Call:<br />lm(formula = df2$used ~ index(df2))<br />Residuals:<br /> Min 1Q Median 3Q Max <br />-484440 -201761 11522 224904 438285 <br />Coefficients:<br /> Estimate Std. Error t value Pr(>|t|) <br />(Intercept) -2.734e+13 4.384e+11 -62.35 <2e-16 ***<br />index(df2) 2.076e+04 3.330e+02 62.35 <2e-16 ***<br />---<br />Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 <br />Residual standard error: 301300 on 12 degrees of freedom<br />Multiple R-squared: 0.9969, Adjusted R-squared: 0.9967 <br />F-statistic: 3888 on 1 and 12 DF, p-value: < 2.2e-16 <br />
  16. 16. 診断図<br />> par(mfrow=c(2,2))<br />> plot(fit)<br />
  17. 17. 推定回帰直線<br />> plot(df$used)<br />> abline(fit, col=2, lty=2)<br />
  18. 18. 限界値に到達する時刻を予測<br />> y <- as.numeric(df$blocks[1]) # ディスク容量<br />> a <- as.numeric(coef(fit)[2]) # 傾き<br />> b <- as.numeric(coef(fit)[1]) # 切片<br />> x <- (y - b) / a<br />> ( x.pos <- start - as.numeric(start) + x )<br />[1] "2011-09-24 07:14:46 JST“<br />> difftime(x.pos, end(df))<br />Time difference of 50.77831 mins<br />このままだとあと50分で破綻するっぽい<br />古いログファイルを圧縮して、<br />/tmp以下を削除するよ!<br />
  19. 19. グラフに描画<br />> xlim <- c(as.numeric(start(df)), x)<br />> ylim<- c(min(df$used), y)<br />> plot(df$used, xlim=xlim, ylim=ylim)<br />> limit <- data.frame(y=c(y, y, y))<br />> rownames(limit) <- c(start, end, x.pos)<br />> par(new=T)<br />> plot(as.xts(limit), xlim=xlim, ylim=ylim,<br />main=NULL, col=3, lty=2)<br />> abline(fit, col=2, lty=2)<br />> points(x.pos, y, col=4, pch=4)<br />
  20. 20. グラフに描画<br />
  21. 21. まとめ<br />ディスク容量を線形回帰で分析してみた。<br />色々なシステム情報を取得して分析してみると面白そう。<br />
  22. 22. 参考資料<br />障害の兆候を見逃さないためのサーバ監視<br />http://www.atmarkit.co.jp/flinux/rensai/root07/root07b.html<br />Xtsパッケージで時系列解析<br />http://www.slideshare.net/teramonagi/tokyo-r15-20110702<br />Rと回帰分析<br />http://mjin.doshisha.ac.jp/R/13.pdf<br />
  23. 23. おしまい<br />ありがとうございました。<br />@mangantempy<br />

×