Ce diaporama a bien été signalé.
Nous utilisons votre profil LinkedIn et vos données d’activité pour vous proposer des publicités personnalisées et pertinentes. Vous pouvez changer vos préférences de publicités à tout moment.

サーバ異常検知入門

15 142 vues

Publié le

  • Soyez le premier à commenter

サーバ異常検知入門

  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 />

×