RFR(L) 8237354: Add option to jcmd to write a gzipped heap dump
David Holmes
david.holmes at oracle.com
Tue Feb 11 22:50:51 UTC 2020
On 11/02/2020 10:55 pm, Yasumasa Suenaga wrote:
> Hi Ralf,
>
> On 2020/02/11 0:33, Schmelter, Ralf wrote:
>> Hi Yasumasa,
>>
>>> You can use `DCmdArgument<jlong>` for -gz option.
>>
>> That is what I originally tried. But then you always have to supply a
>> compression level (just specifying -gz doesn't work). Since I would
>> expect most users never caring about the compression level, I switched
>> to a string option, which can handle this pattern.
>
> I think you can modify DCmdArgument<jlong>::parse_value() to allow the
> operation without argument.
> Or you can add new impl function for integer types which can handle
> default value.
>
>
>>> _nr_of_threads, _id_to_write, _current in CompressionBackend should
>>> be added `volatile` at least.
>>
>> I don't think that is needed. Apart from the initialization, they are
>> only changed under lock protection.
>
> I concerned with compiler optimization.
> They are class members and they are used in `while(true)` loop.
> Of course the problem would not appear in all C++ compiler, but I guess
> it is more safely if `volatile` is added.
As long as the variable is only accessed under the lock then volatile is
not needed. If a compiler hoisted accesses outside of locked regions
then all MT code could be broken.
David
-----
>
>>> BTW how much processing time is different between single threaded and
>>> multi threaded?
>>
>> I've benchmarked an example, which creates a ~31 GB uncompressed hprof
>> file, with a VM which doesn't use any background threads. Here are the
>> size of the create files, the compression level and the time spend:
>>
>> Uncompressed, 31.6 G, 71 sec
>> gzipped level 1, 7.57 G, 463 sec (x6.5)
>> gzipped level 3, 7.10 G, 609 sec (x8.6)
>> gzipped level 6, 6.49 G, 1415 sec (x19.9)
>>
>> So even the fastest gzip compression makes writing the dump at least 5
>> times as slow.
>>
>>> Also I want to know what number is set to ParallelGCThreads.
>>> ParallelGCThreads seems to affect to thread num for GZip compression.
>>
>> Originally, I've tried to use the WorkGang (CollectedHeap::
>> get_safepoint_workers()) of the GC to do the work. But this wouldn't
>> work because Shenandoah could not iterate the heap from a worker
>> thread. So I've opted to start the needed threads itself for the time
>> of the heap dump. I've used ParallelGCThreads as the maximum number of
>> threads, since this is what would be used for a GC too. So it should
>> not clog up the machine more than a GC. Maybe it would be even better
>> to additionally limit the threads by the compression level.
>
> Thanks!
>
> Yasumasa (ysuenaga)
>
>
>> Best regards,
>> Ralf Schmelter
>>
>> -----Original Message-----
>> From: Yasumasa Suenaga <suenaga at oss.nttdata.com>
>> Sent: Samstag, 8. Februar 2020 14:46
>> To: Schmelter, Ralf <ralf.schmelter at sap.com>; OpenJDK Serviceability
>> <serviceability-dev at openjdk.java.net>
>> Cc: yasuenag at gmail.com
>> Subject: Re: RFR(L) 8237354: Add option to jcmd to write a gzipped
>> heap dump
>>
>> Hi Ralf,
>>
>>
>> - diagnosticCommand.cpp
>> You can use `DCmdArgument<jlong>` for -gz option.
>> If you want to use lesser type (e.g. int, unsigned char), I guess
>> you need to modify GenDCmdArgument class.
>>
>> - heapDumper.cpp
>> _nr_of_threads, _id_to_write, _current in CompressionBackend should
>> be added `volatile` at least.
>> (Other values need to be checked)
>>
>>
>> BTW how much processing time is different between single threaded and
>> multi threaded?
>> Also I want to know what number is set to ParallelGCThreads.
>> ParallelGCThreads seems to affect to thread num for GZip compression.
>>
>>
>> Thanks,
>>
>> Yasumasa
>>
More information about the serviceability-dev
mailing list