プログラム実行に対するフェイズ検出を用いた ログ取得量の動的変更手法の提案

Slides:



Advertisements
Similar presentations
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 1 ソフトウェア部品推薦のための.
Advertisements

シーケンス図の生成のための実行履歴圧縮手法
SharePoint Server において 構成ウィザードが失敗する場合の トラブルシューティング
ライフログデータとしての笑顔の蓄積システムの提案
SSR 論文調査 Safety and Cyber-Physical Systems
情報伝播によるオブジェクト指向プログラム理解支援の提案
異種センサを用いた人の行動検知 研究概要 研究の独自性 isi担当 高汐グループ成果 スライド到着待ち yasu担当.
ネストした仮想化を用いた VMの安全な帯域外リモート管理
デバイスからの異常注入が指定可能なCPUエミュレータ
リファクタリングのための 変更波及解析を利用した テスト支援ツールの提案
動的スライスを用いたバグ修正前後の実行系列の差分検出手法の提案
アスペクト指向プログラミングを用いたIDSオフロード
IPv6アドレスによる RFIDシステム利用方式
ソフトウェアリポジトリにおける コードクローン作成者・利用者関係分析手法とその適用
サーバ負荷分散におけるOpenFlowを用いた省電力法
プログラム実行履歴を用いたトランザクションファンクション抽出手法
過負荷時の分散ソフトウェアの 性能劣化を改善する スケジューリングの提案
オブジェクト指向プログラムのための 動的結合メトリクスの評価
類似するコーディングパターンの 利用状況調査ツールの提案
コードクローンに含まれるメソッド呼び出しの 変更度合の分析
コードクローンに含まれるメソッド呼び出しの 変更度合の調査
ソードコードの編集に基づいた コードクローンの分類とその分析システム
動的スライスを用いた バグ修正前後の実行系列の比較
セキュリティ機構のオフロードを考慮した 仮想マシンのスケジューリング
新たなバックアップソリューション「クローン機能」はここがスゴイ 新たなバックアップ方法「クローン機能」なら全て解決!
動的依存グラフの3-gramを用いた 実行トレースの比較手法
2009年度卒業論文発表 CDNコンテンツサーバの動的負荷分散
マルチスレッド処理 マルチプロセス処理について
新たなバックアップソリューション「クローン機能」はここがスゴイ 新たなバックアップ方法「クローン機能」なら全て解決!
シーケンス図を用いて実行履歴を可視化するデバッグ環境の試作
動的スライスを用いたバグ修正前後の実行系列の差分検出手法
利用関係に基づく類似度を用いたJavaコンポーネント分類ツールの作成
ライブラリのバージョン更新支援のための実行トレースからのテストケース生成
限られた保存領域を使用する Javaプログラムの実行トレース記録手法の 提案と評価
Javaプログラムの変更を支援する 影響波及解析システム
動的データ依存関係解析を用いた Javaプログラムスライス手法
東京工業大学 情報理工学研究科 数理・計算科学専攻 千葉研究室 栗田 亮
ソースコードの静的特性を用いた Javaプログラム間類似度測定ツールの試作
Javaバイトコードの 動的依存解析情報を用いた スライシングシステムの実現
未使用メモリに着目した 複数ホストにまたがる 仮想マシンの高速化
プログラム理解におけるThin sliceの 統計的調査による有用性評価
バイトコードを単位とするJavaスライスシステムの試作
○ 後藤 祥1,吉田 則裕2 ,井岡 正和1 ,井上 克郎1 1大阪大学 2奈良先端科学技術大学院大学
ソフトウェア保守のための コードクローン情報検索ツール
ウェブアプリケーションサーバの Degradation Schemeの 制御に向けて
仮想環境を用いた 侵入検知システムの安全な構成法
オブジェクトの協調動作を用いた オブジェクト指向プログラム実行履歴分割手法
静的情報と動的情報を用いた Javaプログラムスライス計算法
同期処理のモジュール化を 可能にする アスペクト指向言語
依存関係の局所性を利用した プログラム依存グラフの 効率的な構築法
保守請負時を対象とした 労力見積のためのメトリクスの提案
dcNavi:デバッグ支援のための グラフベース推薦システム
ETPB: Extraction of Context from Pedestrians' Behavior
オープンソースソフトウェアに対する コーディングパターン分析の適用
ユビキタスコンピューティングの ための ハンドオーバー機能付きRMIの実装
クラスタリングを用いた ベイズ学習モデルを動的に更新する ソフトウェア障害検知手法
蓄積されたオブジェクトの動作履歴を用いた 実行履歴削減手法の提案
CO-Client Opeartion 1.1 利用履歴データベースの設計 (スキーマ バージョン 対応)
エイリアス関係を考慮した Javaプログラム用静的スライシングツール
複雑度メトリクスを用いた JAVAプログラム品質特性の実験的評価
プログラムの一時停止時に 将来の実行情報を提供するデバッガ
動的スライスを用いたバグ修正前後の実行系列の差分検出手法の提案
動的スライスを用いたバグ修正前後の実行系列の差分検出手法の提案
コードクローン解析に基づく デザインパターン適用候補の検出手法
回帰テストにおける実行系列の差分の効率的な検出手法
木構造の比較に基づく メソッド呼び出し履歴の変化の可視化手法
ベイジアンネットワークと クラスタリング手法を用いたWeb障害検知システムの開発
プログラム理解のための 付加注釈 DocumentTag の提案
Presentation transcript:

プログラム実行に対するフェイズ検出を用いた ログ取得量の動的変更手法の提案 溝内剛1 嶋利一真1 石尾隆2 井上克郎1 1大阪大学 2奈良先端科学技術大学院大学

ロギング プログラム実行時の情報を記録 変数情報,エラーメッセージなどを取得 ソースコード中でログとして出力するメッセージを指定 ●~に活用できます ●関数の返り値をプリントするようにしておくと ●しかし,詳細にロギングを行う場合には,利点だけでなく問題も発生します ●次のスライドでサーバプログラムで詳細なログを取る場合を例にとって説明します 次に,サーバプログラムでロギングを行う際の課題について説明いたします max = 2000 min = 10 int calcDiff(List list){ int max = GetMax(list); print (“max = ”+ max ); int min = GetMin(list); print (“min = ”+ min ); return max-min; } ログを詳細に取得して デバッグやプログラム 理解に活用 実行 ソースコード 出力

サーバプログラムにおける ロギングの課題 詳細にロギングを行うと記録量やオーバヘッドが問題になる 記録量 長時間のロギングにより記録量が膨大になる 1台のマシンで1日に2GBのログが出力されるという事例もある[1] オーバヘッド 大量のログ出力処理によりサービスに悪影響が出る サービスの遅延時間の増加 ●サーバプログラムで詳細にロギングを行うと記録量やオーバヘッドが問題に ●サーバプログラムは一般的に長時間稼働させるため,詳細にロギングしていると記録量が膨大に 次に,この課題に対する既存手法について説明いたします [1] Fu, Q., Zhu, J., Hu, W., Lou, J.-G., Ding, R., Lin, Q.,Zhang, D. and Xie, T.: Where Do Developers Log? An Empirical Study on Logging Practices in Industry, Com-panion Proceedings of the 36th International Conference on Software Engineering, pp. 24{33 (2014).

既存手法:ログ出力の制御 Apache Log4j[2]等ロギングライブラリの利用 ログ文にレベルを設定 高レベル 高レベル:エラーメッセージなど優先度の高い情報 ログ出力量小 低レベル:変数の値など詳細な情報 ログ出力量大 FATAL WARN ERROR DEBUG INFO TRACE ●FATAL,,,,TRACEの6レベルがデフォルトで存在 ●プログラム実行時にログ出力レベルを設定することで,~ ●例えば出力レベルINFOに設定すると ●目的によってログの出力量を制御可能 ●次のスライドでこの既存手法で対処できない問題について説明する プログラム実行時に指定した出力レベル以上のログを出力 目的によってログの出力量を制御可能 低レベル [2] Apache Software Foundation: Apache Logging Services -Log4, http://logging.apache.org/log4j

異常な挙動が起きたその際に詳細なログを取得できることが望ましい 既存手法で対処できない問題 開発者側でデバッグを行う際ユーザ側の実行環境で取得したログが必要 ユーザ側からのバグレポートで情報を収集 ユーザ側の実行環境では基本的に高いログ出力レベル[3] ●このような問題を踏まえて,次のスライドで今回の研究内容を説明する ●異常な挙動発生時にTRACEレベルやDEBUGレベルデバッグに必要な情報が取得できない場合が存在 異常な挙動発生時にデバッグに必要な情報が取得でき ない場合が存在 ユーザ側で起きた異常な挙動の再現は困難[4] 異常な挙動が起きたその際に詳細なログを取得できることが望ましい [3] Yuan, D., Park, S. and Zhou, Y.: Characterizing Logging Practices in Open-source Software, Proceedings of the 34th International Conference on Software Engineering, pp. 102--112 (2012). [4] Yuan, D., Mai, H., Xiong, W., Tan, L., Zhou, Y. and Pasupathy, S.: SherLog: Error Diagnosis by Connecting Clues from Run-time Logs, SIGARCH Computer Architecture News, Vol. 38, No. 1, pp. 143--154 (2010).

異常な挙動の起こった際のみ詳細にロギングする手法を提案 研究内容 ユーザ側の異常な挙動発生時の詳細なログが欲しい 例:バグレポート 記録量やオーバヘッドは抑えたい 異常な挙動発生時以外は詳細なログを取得しない ●デバッグのためには,ユーザ側で異常な挙動が発生したときの詳細なログが必要だが記録量やオーバヘッドは抑えてロギングする必要がある ●そこで,本研究では~する手法を提案する ※ここで5分 異常な挙動の起こった際のみ詳細にロギングする手法を提案

提案手法の概要 プログラム実行時の挙動に応じてログ取得量を動的に制御 異常な挙動の起こった際のみ詳細にロギング フェイズ検出手法によって挙動が異常か否かを判定 挙動に応じてログ取得量を動的に変更 Javaプログラムが対象 ●ここで,フェイズとは~ 次に,このフェイズ検出手法について詳しく説明します ※フェイズの説明の時に補足とかいっちゃだめ あるゲームの実行から検出した フェイズの例 タイトル フェイズ:開発者にとって意味のある処理に 対応するイベント ゲーム開始 プレイ画面 スコア表示

フェイズ検出手法:Reissの手法[5] 実行を一定時間ごとの区間に区切り,区間内でのプログラムのデータをベクトル化 現在の区間と一つ前の区間のベクトル類似度から現在の区間のフェイズを決定 類似度 > 閾値:同じフェイズが継続 類似度 < 閾値:違うフェイズが開始 まずReissの手法の解説 次に,このReissの手法を用いた提案手法におけるフェイズ検出について説明します ベクトル0 ベクトル1 ベクトル2 ベクトル3 フェイズ:0 フェイズ:1 フェイズ:2 区間ごとに ベクトル化 類似度 < 閾値 フェイズ 決定 類似度 > 閾値 類似度 < 閾値 [5] Reiss, S. P.: Dynamic Detection and Visualization of Software Phases, Proceedings of the Third International Workshop on Dynamic Analysis, pp. 1--6 (2005).

提案手法におけるフェイズ検出(1/2) 区間内でのプログラムのデータにメソッドごとの実行時間を使用 区間の長さは0.5s A B C 区間(i-1) ベクトル(i-1) A B C =フェイズ:0 [A, B, C] = [10, 3, 7] 実行時間 データを ベクトル化 コサイン類似度を基に比較 この例では, コサイン類似度 = 0.723 閾値を0.95に設定した場合, 異なるフェイズだと判断 メソッド名 区間(i) A B C ベクトル(i) =フェイズ:1 [A, B, C] = [4, 10, 6]

提案手法におけるフェイズ検出(2/2) … <異常な挙動の検出> 提案手法では未知のフェイズを異常なフェイズとして検出 予め収集した既知のフェイズのベクトルデータと判定したい区間のベクトルデータを比較 類似するデータがなければ未知のフェイズと判定 ●提案手法では未知のフェイズを異常なフェイズとして検出している ●学習させたどのフェイズとも類似しない未知のフェイズを異常な挙動が起こっているフェイズとして検出 既知のベクトルデータ 類似する データ有り ベクトル0 ベクトル1 ベクトル2 区間Vは 既知フェイズ … 比較 区間Vは 未知フェイズ ある区間Vの ベクトルデータ 類似する データ無し

予備実験:フェイズ検出の実験 プログラムの未知のフェイズの発生を検出できるか実験 対象:2Dアクションゲーム 効果音を出す処理の際,数秒間フリーズ フリーズしなかったプレイデータを既知の ベクトルデータとして収集 ●このフェイズ検出手法を用いて,プログラムの未知のフェイズの発生を検出できるか実験した ●フリーズしなかったプレイデータを既知のベクトルデータとして収集し,ゲームをフリーズさせて実験した 次に,このフェイズ検出手法を用いたログ取得量の制御法について説明します フリーズ時のフェイズを未知なフェイズとして検出

ログ取得量の動的制御 未知のフェイズを検出→ログ取得量を増やす 既知のフェイズに移行→ログ取得量を元に戻す フェイズ検出手法によりフェイズの既知・未知を判定 ●ログ取得量の動的制御の概要 ログ取得量 切り替え ログ取得量 切り替え 通常の ログ取得量 詳細なロギングのための ログ取得量 通常の ログ取得量 ログ取得量 フェイズ検出 フェイズ:3 フェイズ:3 フェイズ:X フェイズ:Y フェイズ:Z フェイズ:4 フェイズ:5 未知のフェイズ検出! 既知のフェイズに移行

実装:ログ取得量の制御法 Log4jのログ出力レベルを動的に変更 例:既知フェイズINFO レベル 未知フェイズTRACE レベル 対象プログラム ●フェイズ検出&出力レベル変更のプログラムをここでは仮に「監視プログラム」と呼ぶ ●監視プログラムは対象プログラムからメソッド実行時間の情報を取得してフェイズ検出 ※ここで10分 メソッド実行時間の情報 監視プログラム フェイズ検出 Log4j 出力レベル INFO or TRACE 出力レベルの変更

新しいフェイズの学習 … 同じ未知フェイズが2区間連続した場合,既知のベクトルデータに追加 ログ取得量の削減 フェイズ検出 未知のフェイズ ベクトル3 ベクトル4 ベクトル5 … ●同じ未知フェイズが何度も発生することによるログ取得量増加をさける ●未知フェイズの検出によってログ取得量が増加した場合,それによってメソッド実行時間が変わり既知の挙動をしていても未知のフェイズと判定される場合があるため 次のスライドからこの手法の適用事例として行った実験について説明します. 追加 ベクトルX フェイズ検出 フェイズ:3 フェイズ:3 フェイズ:X フェイズ:X フェイズ:X フェイズ:4 フェイズ:5 未知のフェイズ として検出 既知のフェイズ として判定

実験 サーバに対する負荷テストに提案手法を適用 <目的> 負荷をかけた状態でログ出力レベルが変化するか実験 <実験内容> Apache Tomcatサーバ上で動くJPetStoreに対して 負荷テストを実施 100スレッドでそれぞれ10000回アクセスを行った際の ベクトルデータを既知のベクトルデータとして収集 (1)のデータを元に10000スレッドでそれぞれ10000回 アクセスした場合で実験 (Tomcat起動後30秒で負荷テスト開始)

実験結果 … 負荷テストの開始時にログ出力レベルの切り替わりを確認 新たな未知フェイズが検知されなくなると元のログ出力レベル に移行 Tomcat起動 (出力レベルINFO) 高レベル … FATAL WARN ERROR DEBUG INFO TRACE 30秒 ●Tomcat起動後,30秒で負荷テストを開始したが,ログの方でも起動から30秒後の時点でログの出力レベルが変更されていた ●また,異常フェイズが検知されなくなると最初のログ出力レベルに移行していたことを確認した 以降はTRACE, DEBUGも出力 低レベル 新たな未知フェイズが検知されなくなると元のログ出力レベル に移行 以降はINFO以上の ログのみ

Tomcat起動から負荷テスト終了までの時間 ログサイズと実行時間 出力レベル ログファイルサイズ Tomcat起動から負荷テスト終了までの時間 TRACE(固定) 938.9MB 42分54秒 INFO(固定) 12.1MB 1分14秒 TRACE  INFO 12.3MB 1分38秒 学習データ無 12.9MB 1分39秒 ●ログのファイルサイズとtomcat起動から負荷テスト終了までの時間を計測し,出力レベルtrace, infoで固定した場合と比較した ●すべてtraceの場合と比べると,大きく差があった. ●すべてinfoでログをとった場合と2MB,24秒の差しかなかった ●減少量・増加量は対象プログラムのログ出力量に依存するため,他のプログラムでも実験する必要がある 出力レベルTRACEと比較すると,ファイルサイズと実行時間が大きく減少する 出力レベルINFOからのファイルサイズと実行時間の増加量は小さい 今回の実験では記録量・オーバヘッドを抑えることができた 減少量・増加量は対象プログラムのログ出力量に依存する 他のプログラムで実験する必要する有り

まとめと今後の課題 まとめ プログラム実行時の挙動に応じてログ取得量を動的に制御する手法を提案 フェイズ検出手法によってプログラムの未知の挙動を検出 ログ出力レベルを動的に切り替えログ取得量を制御 今後の課題 実際に削減できるログの量,異常発生時にデバッグに必要な情報が取得できるか評価 ●未知のフェイズが始まった少し前のフェイズからの詳細なログの取得