Amazon CodeGuru Profiler

Amazon CodeGuru ProfilerのPOCメモ
https://aws.amazon.com/jp/blogs/aws/find-your-most-expensive-lines-of-code-amazon-codeguru-is-now-generally-available/
※GAになり東京リージョンで利用できるようになっています。

- セットアップ
 - プロファイリンググループの作成 
![CGProfiler3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325048/a2e59608-ed96-9592-bafb-80ec2d77f7bc.png)


- エージェントダウンロード、JVM引数設定

![CGProfiler4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325048/9e50493a-740d-b6fc-5bf0-4a97b0f2f6c9.png)


環境変数の設定。本POCでは.bash_profileに設定

```
export AWS_ACCESS_KEY_ID=XXXXXXXXXX
export AWS_SECRET_ACCESS_KEY=YYYYYYYYYY
```

JVMの設定
codeguru-profiler-java-agent-standalone-1.0.0.jarはマネジメントコンソールからダウンロードする。
下記のTestGroupはマネジメントコンソールでプロファイリンググループを作成した時に指定した名前。

```
java -javaagent:codeguru-profiler-java-agent-standalone-1.0.0.jar="profilingGroupName:TestGroup" -Xms3000m -Xmx3000m -jar poipoc-0.0.1-SNAPSHOT.jar
```

動作ログは下記のようになる。5分に一回標準出力にログ出力されていた。

```
2020-06-30 17:00:12.467  INFO 3776 --- [Amazon-Profiler] c.s.a.c.ProfilingCommand                 : Attempting to report profile data: start=2020-06-30T07:55:12.139Z end=2020-06-30T08:00:12.467Z force=false memoryRefresh=false numberOfTimesSampled=301
2020-06-30 17:00:12.677  INFO 3776 --- [Amazon-Profiler] c.s.a.c.ProfilingCommand                 : Successfully reported profile
2020-06-30 17:00:13.777  INFO 3776 --- [Amazon-Profiler] c.s.a.c.ProfilingCommand                 : New agent configuration received : AgentConfiguration(AgentParameters={MaxStackDepth=1000, MinimumTimeForReportingInMilliseconds=60000, SamplingIntervalInMilliseconds=1000, MemoryUsageLimitPercent=10, ReportingIntervalInMilliseconds=300000}, PeriodInSeconds=300, ShouldProfile=true)
2020-06-30 17:05:14.106  INFO 3776 --- [Amazon-Profiler] c.s.a.c.ProfilingCommand                 : Attempting to report profile data: start=2020-06-30T08:00:13.777Z end=2020-06-30T08:05:14.106Z force=false memoryRefresh=false numberOfTimesSampled=301
2020-06-30 17:05:14.234  INFO 3776 --- [Amazon-Profiler] c.s.a.c.ProfilingCommand                 : Successfully reported profile
2020-06-30 17:05:15.332  INFO 3776 --- [Amazon-Profiler] c.s.a.c.ProfilingCommand                 : New agent configuration received : AgentConfiguration(AgentParameters={MaxStackDepth=1000, MinimumTimeForReportingInMilliseconds=60000, SamplingIntervalInMilliseconds=1000, MemoryUsageLimitPercent=10, ReportingIntervalInMilliseconds=300000}, PeriodInSeconds=300, ShouldProfile=true)
2020-06-30 17:10:15.661  INFO 3776 --- [Amazon-Profiler] c.s.a.c.ProfilingCommand                 : Attempting to report profile data: start=2020-06-30T08:05:15.332Z end=2020-06-30T08:10:15.660Z force=false memoryRefresh=false numberOfTimesSampled=301
2020-06-30 17:10:15.847  INFO 3776 --- [Amazon-Profiler] c.s.a.c.ProfilingCommand                 : Successfully reported profile
2020-06-30 17:10:16.950  INFO 3776 --- [Amazon-Profiler] c.s.a.c.ProfilingCommand                 : New agent configuration received : AgentConfiguration(AgentParameters={MaxStackDepth=1000, MinimumTimeForReportingInMilliseconds=60000, SamplingIntervalInMilliseconds=1000, MemoryUsageLimitPercent=10, ReportingIntervalInMilliseconds=300000}, PeriodInSeconds=300, ShouldProfile=true)
2020-06-30 17:15:17.274  INFO 3776 --- [Amazon-Profiler] c.s.a.c.ProfilingCommand                 : Attempting to report profile data: start=2020-06-30T08:10:16.950Z end=2020-06-30T08:15:17.274Z force=false memoryRefresh=false numberOfTimesSampled=301
2020-06-30 17:15:17.422  INFO 3776 --- [Amazon-Profiler] c.s.a.c.ProfilingCommand                 : Successfully reported profile
2020-06-30 17:15:18.529  INFO 3776 --- [Amazon-Profiler] c.s.a.c.ProfilingCommand                 : New agent configuration received : AgentConfiguration(AgentParameters={MaxStackDepth=1000, MinimumTimeForReportingInMilliseconds=60000, SamplingIntervalInMilliseconds=1000, MemoryUsageLimitPercent=10, ReportingIntervalInMilliseconds=300000}, PeriodInSeconds=300, ShouldProfile=true)
2020-06-30 17:20:18.858  INFO 3776 --- [Amazon-Profiler] c.s.a.c.ProfilingCommand                 : Attempting to report profile data: start=2020-06-30T08:15:18.530Z end=2020-06-30T08:20:18.858Z force=false memoryRefresh=false numberOfTimesSampled=301
2020-06-30 17:20:18.996  INFO 3776 --- [Amazon-Profiler] c.s.a.c.ProfilingCommand                 : Successfully reported profile
2020-06-30 17:20:20.099  INFO 3776 --- [Amazon-Profiler] c.s.a.c.ProfilingCommand                 : New agent configuration received : AgentConfiguration(AgentParameters={MaxStackDepth=1000, MinimumTimeForReportingInMilliseconds=60000, SamplingIntervalInMilliseconds=1000, MemoryUsageLimitPercent=10, ReportingIntervalInMilliseconds=300000}, PeriodInSeconds=300, ShouldProfile=true)
```

CPUコスト観点でみた時の表示。CPUコストの高い処理が面積大きく表示される。逆に処理コストの低いものは表示されなかった。
コスト問題の特定を重視し、CodeGuru Profiler側で適宜フィルタリングしているようにみえる。
本POCではSpring Bootを利用しているがコストの高いServiceを発見しやすかったのが特徴。
Java VisualVMではServiceのメソッドよりもService内で多数を占める処理が上位表示される。本POCではApache POIの処理がボトルネックだったがPOI内のorg.apache.*が上位表示されてしまうため根本原因が一目で判り難い。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325048/12b1a5fc-5713-8748-581e-b098c179991c.png)

レイテンシー観点でみた時の表示。画面右上のリンクから時間のレンジ指定で対象を絞り込める。
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325048/6bba1e45-d864-b4c9-59d8-a2b81d038e0b.png)


リソースの負荷(nmon16m_x86_64_rhel8での計測)

| 状態             |  無風状態CPU使用率 |   負荷有り時CPU使用率|
|:-----------------|------------------:|------------------:|
| CodeGuru on      |              0.3% |              49.1%|
| CodeGuru off     |              0.3% |             44.25%|


- CPUコスト
　-　CPU、レイテンシーともにコストの高い処理が呼び出し関係を保持した形、かつコストに比例した面積で可視化されるため対応効果の高い処理を特定しやすいのが特徴。開発者が手出しできないライブラリやプリミティブ要素に惑わされない配慮がなされている。
逆にコストの低い処理はプロファイラ側で適宜フィルタリングしているように見える。
![CGProfiler1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325048/1ad80d9b-210a-d4d6-060d-7259235ab022.png)

- レイテンシー
 - 処理コストの高い部分にフォーカスできるようなMinimap機能が提供されている。
時間帯指定ができるため、過去の振り返り分析が可能。
ボトルネックへの到達容易性のための画面操作（右クリックメニュー）が提供されている。
例：ズームイン、非表示等
V1.0.0ではメモリ関連の可視化機能は実装されていない。
![CGProfiler2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325048/e111ee3f-646e-6eb9-eaac-1d1b1b8faf31.png)

- レコメンデーション
![CGProfiler5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325048/f7334c43-4c58-564c-75d8-66455ccbda3d.png)

![CGProfiler6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325048/c356a9e2-3589-4742-61b4-85589fa63143.png)

![CGProfiler7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325048/96131d73-3b1b-8942-5f8e-28efe3c2a359.png)

![CGProfiler8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325048/d38f22d6-384e-22d1-d07e-9049675a8a33.png)