More Related Content
Similar to サーバ異常検知入門 (20)
サーバ異常検知入門
- 7. サンプルデータの作成 「df」コマンドを使用します。 $ df Filesystem 1K-ブロック 使用 使用可 使用% マウント位置 /dev/vzfs 83886080 4738368 79147712 6% / none 262144 4 262140 1% /dev
- 8. こんな感じのシェルスクリプトを作って #!/bin/bash datetime=`date ‘+%F %H:%M’`# 日付 values=`df | awk‘/devvzfs/ {print $2“,”$3“,”$4}’`# 観測値 echo $datetime,$values# まとめて出力 cronで定期的に動かして、ログに保存 $ crontab -l * * * * * ~/df.sh >> ~/df.log 2> /dev/null 最初にヘッダを入れておくと良いかも $echo "datetime,blocks,used,available" > ~/df.log
- 9. でかいファイルを作る適当なバッチを動かしておく 結果はこんな感じ $ cat ~/df.log datetime,blocks,used,available 2011-09-24 06:06,83886080,4738280,79147800 2011-09-24 06:07,83886080,4738272,79147808 2011-09-24 06:08,83886080,4738280,79147800 2011-09-24 06:09,83886080,4738284,79147796 2011-09-24 06:10,83886080,4738296,79147784 2011-09-24 06:11,83886080,4738280,79147800 2011-09-24 06:12,83886080,5787884,78098196 2011-09-24 06:13,83886080,6837488,77048592 2011-09-24 06:14,83886080,7887092,75998988 2011-09-24 06:15,83886080,8936696,74949384 2011-09-24 06:16,83886080,11035904,72850176 2011-09-24 06:17,83886080,12085508,71800572 2011-09-24 06:18,83886080,13135112,70750968 : (以下略)
- 10. Rで分析 CSVデータを読み込む > df.dataframe <- read.csv("df.log") > head(df.dataframe) datetime blocks used available 1 2011-09-24 06:06 83886080 4738280 79147800 2 2011-09-24 06:07 83886080 4738272 79147808 3 2011-09-24 06:08 83886080 4738280 79147800 4 2011-09-24 06:09 83886080 4738284 79147796 5 2011-09-24 06:10 83886080 4738296 79147784 6 2011-09-24 06:11 83886080 4738280 79147800
- 11. 日時を行の名前にする > rownames(df.dataframe) <- df.dataframe$datetime > df.dataframe$datetime <- NULL > head(df.dataframe) blocks used available 2011-09-24 06:06 83886080 4738280 79147800 2011-09-24 06:07 83886080 4738272 79147808 2011-09-24 06:08 83886080 4738280 79147800 2011-09-24 06:09 83886080 4738284 79147796 2011-09-24 06:10 83886080 4738296 79147784 2011-09-24 06:11 83886080 4738280 79147800
- 12. Xtsオブジェクトに変換 > install.packages("xts") > library(xts) > df <- as.xts(df.dataframe) > head(df) blocks used available 2011-09-24 06:06:00 83886080 4738280 79147800 2011-09-24 06:07:00 83886080 4738272 79147808 2011-09-24 06:08:00 83886080 4738280 79147800 2011-09-24 06:09:00 83886080 4738284 79147796 2011-09-24 06:10:00 83886080 4738296 79147784 2011-09-24 06:11:00 83886080 4738280 79147800 > ( start <- start(df) ) [1] "2011-09-24 06:06:00 JST" > ( end <- end(df) ) [1] "2011-09-24 06:24:00 JST"
- 14. ある区間のデータを抜き出す > df2 <- df['2011-09-24 06:11:00::'] > head(df2) blocks used available 2011-09-24 06:11:00 83886080 4738280 79147800 2011-09-24 06:12:00 83886080 5787884 78098196 2011-09-24 06:13:00 83886080 6837488 77048592 2011-09-24 06:14:00 83886080 7887092 75998988 2011-09-24 06:15:00 83886080 8936696 74949384 2011-09-24 06:16:00 83886080 11035904 72850176 > start(df2) [1] "2011-09-24 06:11:00 JST" > end(df2) [1] "2011-09-24 06:24:00 JST"
- 15. 回帰分析 > fit <- lm(df2$used~index(df2)) > summary(fit) Call: lm(formula = df2$used ~ index(df2)) Residuals: Min 1Q Median 3Q Max -484440 -201761 11522 224904 438285 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) -2.734e+13 4.384e+11 -62.35 <2e-16 *** index(df2) 2.076e+04 3.330e+02 62.35 <2e-16 *** --- Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 Residual standard error: 301300 on 12 degrees of freedom Multiple R-squared: 0.9969, Adjusted R-squared: 0.9967 F-statistic: 3888 on 1 and 12 DF, p-value: < 2.2e-16
- 18. 限界値に到達する時刻を予測 > y <- as.numeric(df$blocks[1]) # ディスク容量 > a <- as.numeric(coef(fit)[2]) # 傾き > b <- as.numeric(coef(fit)[1]) # 切片 > x <- (y - b) / a > ( x.pos <- start - as.numeric(start) + x ) [1] "2011-09-24 07:14:46 JST“ > difftime(x.pos, end(df)) Time difference of 50.77831 mins このままだとあと50分で破綻するっぽい 古いログファイルを圧縮して、 /tmp以下を削除するよ!
- 19. グラフに描画 > xlim <- c(as.numeric(start(df)), x) > ylim<- c(min(df$used), y) > plot(df$used, xlim=xlim, ylim=ylim) > limit <- data.frame(y=c(y, y, y)) > rownames(limit) <- c(start, end, x.pos) > par(new=T) > plot(as.xts(limit), xlim=xlim, ylim=ylim, main=NULL, col=3, lty=2) > abline(fit, col=2, lty=2) > points(x.pos, y, col=4, pch=4)