製品環境でzgcを使用しようとしているので、jdkをjdk8からopenjdk 15、tomcat8からtomcat8.5、およびgc関連オプションに更新しましたが、jvmの開始から数時間後にCPU使用率が1000 +%になります(通常のCPU使用率は100〜300%である必要があります)。CPUが高い場合、ログファイルにICBufferFullの安全なポイントが多数あることがあります。
[2020-11-12T19:00:43.669+0800] Safepoint "ICBufferFull", Time since last: 41374119 ns, Reaching safepoint: 2026134 ns, At safepoint: 85993 ns, Total: 2112127 ns
[2020-11-12T19:00:43.672+0800] Safepoint "ICBufferFull", Time since last: 2521598 ns, Reaching safepoint: 1109894 ns, At safepoint: 57235 ns, Total: 1167129 ns
[2020-11-12T19:00:43.676+0800] Safepoint "ICBufferFull", Time since last: 2892867 ns, Reaching safepoint: 1240834 ns, At safepoint: 59633 ns, Total: 1300467 ns
[2020-11-12T19:00:43.681+0800] Safepoint "ICBufferFull", Time since last: 2870110 ns, Reaching safepoint: 1425837 ns, At safepoint: 54052 ns, Total: 1479889 ns
ノードを約30秒間オフラインにすると、CPUがダウンし、次にオンラインにすると、CPUが再びハイになるまで何時間も正常に動作します。ソースコードを確認しました。ICBufferFullは「インラインキャッシュバッファがいっぱいです」という意味ですが、それを増やすオプションが見つかりません。誰かがこれを助けることができますか?ありがとう!
gcオプションは次のとおりです。
export JAVA_OPTS='-Xms10g -Xmx10g -XX:+UseLargePages -XX:ZAllocationSpikeTolerance=5 -XX:ParallelGCThreads=8 -XX:ConcGCThreads=4 -Xss2m -XX:+UseZGC -Xlog:gc,gc+phases,safepoint:file=/logs/gc.log:t:filecount=10,filesize=10m -XX:+HeapDumpOnOutOfMemoryError'
edit1:
別のホストがjdk8で正常に動作し、cmsを参照として使用していますが、2つのホストへの要求はほぼ同じです。
私はそれをasync-profileでプロファイリングしました、最もホットなメソッドはjava/lang/ThreadLocal$ThreadLocalMap.getEntryAfterMiss
、50 +%で発生し、最もホットなネイティブメソッドはZMark::try_mark_object(ZMarkCache*, unsigned long, bool)
、0.41%のみで発生しました。jdk8とopenjdk15のスレッドローカル関連のソースコードを確認しましたが、変更されていないようです。
edit2:
JIRAで同様のバグを見つけました。私のアプリケーションもluceneに関連しており、gcログから、弱参照数が1m以上の場合、使用率が高くなります。したがって、問題は、zgcで弱参照をより積極的に収集する方法です。
edit3:
System.gc()が3秒ごとに呼び出された次のログから、私のアプリケーションは弱参照を生成しすぎたようです。しかし、開始後も生産数が増え続けるのは不思議です。リクエストは11:00〜17:00までほぼ一定です。GC(9821)の後、CPUが600%から400%に自動的に低下したことに注意してください。エンキューされたのは、約250Kです。GC(10265)ノードはオフラインで、キューに入れられたのは約770Kでした。長い間、キューに入れられたカウントが少ないのはなぜですか?オブジェクトが完全に再利用されていないことを意味しますか?
[2020-11-19T11:00:00.245+0800] GC(992) Weak: 155658 encountered, 72334 discovered, 0 enqueued
[2020-11-19T12:00:00.397+0800] GC(2194) Weak: 220462 encountered, 122216 discovered, 1380 enqueued
[2020-11-19T12:00:03.411+0800] GC(2195) Weak: 220598 encountered, 107228 discovered, 677 enqueued
[2020-11-19T13:00:00.497+0800] GC(3395) Weak: 222536 encountered, 82199 discovered, 1713 enqueued
[2020-11-19T14:00:00.647+0800] GC(4613) Weak: 443946 encountered, 291651 discovered, 292 enqueued
[2020-11-19T15:00:01.173+0800] GC(5819) Weak: 338065 encountered, 124351 discovered, 815 enqueued
[2020-11-19T16:00:01.283+0800] GC(7022) Weak: 459070 encountered, 298932 discovered, 353 enqueued
[2020-11-19T17:00:01.426+0800] GC(8222) Weak: 688162 encountered, 519369 discovered, 4648 enqueued
[2020-11-19T16:00:01.283+0800] GC(7022) Weak: 459070 encountered, 298932 discovered, 353 enqueued
[2020-11-19T17:00:01.426+0800] GC(8222) Weak: 688162 encountered, 519369 discovered, 4648 enqueued
[2020-11-19T18:00:01.556+0800] GC(9430) Weak: 1078757 encountered, 928748 discovered, 1691 enqueued
[2020-11-19T18:18:43.595+0800] GC(9821) Weak: 1022080 encountered, 841168 discovered, 247352 enqueued
[2020-11-19T18:18:46.592+0800] GC(9822) Weak: 774253 encountered, 568564 discovered, 3938 enqueued
[2020-11-19T18:40:49.616+0800] GC(10265) Weak: 842081 encountered, 788825 discovered, 767288 enqueued
[2020-11-19T18:40:52.593+0800] GC(10266) Weak: 74876 encountered, 18186 discovered, 1 enqueued
最新のGCは、到達しにくいオブジェクトの収集を遅らせます。
によってトリガーされるコレクションは、System.gc()
常に到達不能なオブジェクトを処理し、デフォルトで同時実行されるため、メソッドを呼び出す定期的なタスクを実装できます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加