各資料を基にしたまとめ。
非機能要件とは
- 「性能問題」と言われたりする。では「性能問題」とは何か。
- 「性能問題」が発生する条件とは何か。
- その中でのプログラムの位置付け
- プログラムが備えるべき特性
基本
非機能要求グレードご紹介~システム基盤における非機能要求の見える化ツール~
システム構築の上流工程強化(非機能要求グレード):IPA 独立行政法人 情報処理推進機構
非機能要件 - Wikipedia
Non-functional requirement - Wikipedia
詳細
DBアクセスおよびDBサーバーの問題
SQL文の発行回数
- 大原則:SQLを発行する回数は少ない方が良い。
- 保留や例外:どれくらい減らすのは有効で、どれくらい減らすのは無駄か。
- 実装レベルでSQL発行回数を減らす方法(結合、キャッシュ、etc.)を工夫する。
個々のSQL文の改善
- 実行計画の検討
- バインド変数の利用
データモデリングとDB表
- 正規化の得失
DBリソースの取得と解放
- 解放漏れがあった場合の影響
- 解放漏れの探し方
APサーバーの問題
時間計算量と空間計算量のトレードオフに関わる問題
- GC概要
- 連続メモリ領域の要求
- トレードオフを招くambivalentなキャッシュ
トレードオフになりづらい計算量の改善
- ループ内処理の順序の最適化
- 文字列加算の抑制
- オブジェクト生成の抑制
- 適切なキャッシュ
トレードオフになりづらいメモリ使用量の抑制
- 適切なキャッシュ(immutableオブジェクト)
- オブジェクト生成の抑制(遅延生成など)
- ここでも正規化
- クラスの属性を減らす
- トレードオフになりづらいディスクI/Oの問題
- 一時ファイル利用の得失
- 同期処理(synchronization)に関わる問題
- Tips
- 文字列関連クラスの扱い(String、StringBuffer、equals()、hashCode()
etc.) - 参照の繋ぎ方に気をつけよう
- 配列に気をつけよう
- n^2の計算量を避ける手法。
- 何でもかんでも配列やリストを利用するのではなく、Map(連想配列)を積極的に利用しよう。
- Map(連想配列)のキーにStringを使うのは避けよう。
- etc.
- 文字列関連クラスの扱い(String、StringBuffer、equals()、hashCode()
プログラムのタイプごとに固有の問題
オンライン・リアルタイム処理(サーブレット等)
- オブジェクトの寿命と可視範囲:
- JVM(正確にはクラスローダー)に対応するオブジェクト
- HttpSessionに対応に対応するオブジェクト
- HttpRequestに対応に対応するオブジェクト
- ユーザーの挙動(性能低下 -> ログオフしない -> メモリ逼迫 ->
gc頻発、という悪循環)
いわゆるバッチ
- 実行時間とキュー詰まりの問題
- 通常のJavaバッチ
- メモリリークの避け方
トラブルシューティングやテストに使えるツール
- SQL監視ツール
- JVMプロファイラ
- OSリソース監視ツール
- 負荷テストツール
- heapdump、javacore、GCログ分析ツール
参考
オラクルコンサルが語る!性能問題を防ぐ適切な性能テスト手法とボトルネック解析手法
AWS システム構築 非機能要件ヒアリングシートを公開してみた | DevelopersIO
以上、参考になればさいわいです。