Hi all,

I've uploaded PoC of PerfCounter for STW phase in concurrent GC:

  hotspot: http://cr.openjdk.java.net/~ysuenaga/perfcounter-for-cgc/hotspot/
      jdk: http://cr.openjdk.java.net/~ysuenaga/perfcounter-for-cgc/jdk/

These patches makes new jstat column CGC and CGCT as below:
-------------
$ jstat -gc 53494 3000
 S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU 
   CCSC   CCSU   YGC     YGCT    FGC    FGCT    CGC    CGCT     GCT
 0.0    0.0    0.0    0.0    4096.0    0.0     28672.0      0.0     4480.0 
948.9  384.0   77.6       0    0.000   0      0.000   0      0.000    0.000
 0.0   1024.0  0.0   1024.0  3072.0    0.0     28672.0      0.0     4864.0 
2969.0 512.0  276.0       1    0.063   0      0.000   2      0.016    0.080
-------------

They are shows STW phase in concurrent GC.

  CMS: Initial Mark and Remark
   G1: Remark and Cleanup

GCT is sum of YGCT, FGCT, and CGCT.


Can be this change accepted?
If so, I will file it to JBS and will send RFR.

I cannot access JPRT.
So I need a sponsor.


Thanks,

Yasumasa


On 2016/03/02 23:19, Yasumasa Suenaga wrote:
It is not difficult to create webrev for this proposal.
However, this proposal affects to jstat output, and
I cannot access JPRT.
So I want to find sponsor for it at first.

Could somebody be a sponsor?


Yasumasa


On 2016/03/02 22:29, k...@kodewerk.com wrote:
Hi Yasumasa,

It all sounds reasonable and of course the impact on downstream tooling vs the 
value of the change must be evaluated. In this case I think adding a CGC 
counter makes sense especially in prep for G1 becoming default in 9.

Regards,
Kirk

On Mar 2, 2016, at 6:58 AM, Yasumasa Suenaga <yasue...@gmail.com> wrote:

Hi Kirk,

Agree to you.
However, I use occasional FGC counter at CMS as below:

1. Check major collection occurrence
      Some production systems have large memory as Java heap,
      and they are not set GC log.
      If their CPU usage becomes high, I want to check GC execution.
      (Of course, we have to check any other points :-) )

2. Core image analysis
      If JVM is crashed, I want to check PerfCounter to know situation.
      (In the past, I sometimes encountered crash at GC worker thread.)

I guess that I will want to check them at G1.

Thus, at least, I want to add PerfCounter for CGC (and add JVMTI event hook).
However, this proposal will affect to jstat spec.
So I want to discuss about it before filing to JBS.


Thanks,

Yasumasa


On 2016/03/02 19:02, k...@kodewerk.com wrote:
Hi Yasumasa,

Good question. I’ve never considered CMS to be a Full GC. This implies that 
there should be separate performance counters for CMS pause phases as it is 
possible to have FGC. Of course a FGC during CMS maybe user triggered, 
triggered outside a CMS cycle, interrupts a CMS cycle, or interrupts a CMS 
phase. I’m not sure how much of a distinction one needs to make here as that 
could be a quick broader discussion. Certainly the purpose isn’t to recreate 
the GC logs in these performance counters. But at the very least not having a 
distinction between full and a STW-CMS phase is kind of misleading in my 
opinion.

Regards,
Kirk

On Mar 1, 2016, at 5:03 PM, Yasumasa Suenaga <yasue...@gmail.com> wrote:

Hi Kirk,

It is also incorrect to count initial mark and remark in CMS as a FGC.

Though, how can we check execution of major collection without GC log?
Should we add new PerfCounter for CGC (and add CGC column to jstat output)?


Yasumasa


On 2016/03/02 6:35, k...@kodewerk.com wrote:
Hi,

I think it is incorrect to count remark and cleanup as FGC. They are not full 
collections. It is also incorrect to count initial mark and remark in CMS as a 
FGC. It is unfortunate that this is counted this way.

Regards,
Kirk

On Mar 1, 2016, at 8:56 AM, Yasumasa Suenaga <yasue...@gmail.com> wrote:

Hi all,

I wonder that STW phases (Remark and Cleanup) at G1 are not counted in jstat 
FGC column.
For example, Initial Mark and Remark at CMS are counted as FGC.

For consistency, I think that G1 STW phases should be counted as FGC.
What do you think about it?

If it is accepted, I will file it to JBS and will upload webrev.


suggested fix:
----------------------
diff -r 8a103ba9a7b2 src/share/vm/gc/g1/g1MonitoringSupport.cpp
--- a/src/share/vm/gc/g1/g1MonitoringSupport.cpp    Mon Feb 29 22:54:24 2016 
+0900
+++ b/src/share/vm/gc/g1/g1MonitoringSupport.cpp    Tue Mar 01 23:43:30 2016 
+0900
@@ -103,7 +103,7 @@
   //   name "collector.1".  In a generational collector this would be the
   // old generation collection.
   _full_collection_counters =
-    new CollectorCounters("G1 stop-the-world full collections", 1);
+    new CollectorCounters("G1 stop-the-world phase", 1);

   // timer sampling for all counters supporting sampling only update the
   // used value.  See the take_sample() method.  G1 requires both used and
diff -r 8a103ba9a7b2 src/share/vm/gc/g1/vm_operations_g1.cpp
--- a/src/share/vm/gc/g1/vm_operations_g1.cpp    Mon Feb 29 22:54:24 2016 +0900
+++ b/src/share/vm/gc/g1/vm_operations_g1.cpp    Tue Mar 01 23:43:30 2016 +0900
@@ -230,6 +230,8 @@
   G1CollectedHeap* g1h = G1CollectedHeap::heap();
   GCTraceTime(Info, gc) t(_printGCMessage, g1h->gc_timer_cm(), 
GCCause::_no_gc, true);
   IsGCActiveMark x;
+  SvcGCMarker sgcm(SvcGCMarker::OTHER);
+  TraceCollectorStats tcs(g1h->g1mm()->full_collection_counters());
   _cl->do_void();
}

----------------------


Thanks,

Yasumasa





Reply via email to