RFR(S/M): 8217659 monitor_logging updates from Async Monitor Deflation project

Daniel D. Daugherty daniel.daugherty at oracle.com
Thu Jan 24 23:52:46 UTC 2019


Hi Coleen,

Thanks for the review. Replies embedded below...


On 1/24/19 3:39 PM, coleen.phillimore at oracle.com wrote:
>
> http://cr.openjdk.java.net/~dcubed/8217659-webrev/0-for-jdk13/src/hotspot/share/runtime/synchronizer.cpp.frames.html 
>
>
> 1426 if (log_is_enabled(Trace, monitorinflation)) {
> 1427         if (object->is_instance()) {
> 1428           ResourceMark rm(Self);
> 1429 log_trace(monitorinflation)("inflate(has_locker): "
> 1430                                       "object=" INTPTR_FORMAT ", 
> mark=" INTPTR_FORMAT ", type='%s'",
> 1431                                       p2i(object), 
> p2i(object->mark()),
> 1432 object->klass()->external_name());
> 1433         }
> 1434       }
>
> It seems like extra overhead to ask if logging is enabled in both 1426 
> and internally in 1429.  It seems that if object->is_instance() is a 
> cheap test, 1426 is unnecessary.  I realize it was like this.   Same 
> at 1477, 1532.  I don't think ResourceMarks are expensive either.

I'll take a closer look at the various 'log_is_enabled()' calls
and how to make things more efficient in general. I have a memory
of someone saying that log_is_enabled() is pretty cheap.

If memory serves correctly, 'ResourceMark rm' is expensive and
'ResourceMark rm(thread)' is much less expensive, but still has a
non-trivial cost. If the parameters to a log_foo() call are
expensive to assemble, we don't want to do that only to throw them
away because the log_foo() code skips the log output.

The call to external_name() which allocates a C-string buffer and
translates the Java char string into the C-string is not cheap so
I think this is one of the cases where we don't want the log_foo()
call to make the decision.

Also, the object->is_instance() check may be going away. Neither
David nor I can remember why this logging code makes that check
so I need to chase that down.


 > 1652   if (deflated_count != 0) {
> 1653 if (log_is_enabled(Info, monitorinflation)) {
> 1654 log_info(monitorinflation)("deflating global idle monitors, %3.7f 
> secs, %d monitors", timer.seconds(), deflated_count);
> 1655 }
> 1656 } else {
> 1657 if (log_is_enabled(Debug, monitorinflation)) {
> 1658 log_debug(monitorinflation)("deflating global idle monitors, 
> %3.7f secs, 0 monitors", timer.seconds());
> 1659 }
>
>
> log_info/log_debug also ask if log_is_enabled, so the log_is_enabled 
> test isn't necessary here, and 1673, 1677 and 1664.  I think a lot of 
> these were early logging changes that weren't caught then.

David had a suggested rewrite for these lines in his comments that
I'm going to check out. One thing I'm trying to avoid is double
output lines if we're at log level Debug.


> Duplicating David's comment
>
> audit_and_print_stats
>
> can create a LogStream log and use that instead of doing log_info/etc.

Yup. I'm going to figure out how to do that.


> Instead of
>
> 2048 if (IncludeInUseMonitorDetailsInLogMsgs) {
>
> You can add a tag to the logging, so that you can say 
> -Xlog:monitorinflation+inuse or some such tag.
>
> It's not worth adding another command line option when logging gives 
> you the ability to be specific about what output you want.

Thanks for chiming in on IncludeInUseMonitorDetailsInLogMsgs.

That's another possibility. I'll look at that also. In my reply
to David I said:

> Thanks for chiming in on IncludeInUseMonitorDetailsInLogMsgs. I tend
> to agree hence the question during this review cycle. I'm thinking
> that at VM-exit time, it should be at Debug level and at safepoint
> time it should be at Trace level. I expect most casual use of
> monitorinflation logging to be at the Info level... And this output
> is far from casual... 

so I have two possible solutions to look at...


> Lastly, I didn't look at what you're verifying and logging but maybe 
> the ~300 line function could be split and you could add more tags in 
> the future to taylor what specific information and verification you 
> are looking for.

I'm not sure what you're suggesting here.


> It looks there's a bit of duplication in the logging messages.

I wasn't aware of any duplication, but I could have missed somthing...

Dan


>
> Coleen
>
> On 1/23/19 3:16 PM, Daniel D. Daugherty wrote:
>> Greetings,
>>
>> I have a (S)mall/(M)edium patch extracted from the Async Monitor 
>> Deflation
>> project that is ready for code review. I'm calling this a 
>> (S)mall/(M)edium
>> because the logic changes are (S)mall, but the logging code is 
>> tedious and
>> there's a bunch of it in audit_and_print_stats() so (M)edium.
>>
>> The short version of what this patch is about:
>>
>>     This sub-task captures updates and additions to the
>>     baseline monitor logging code.
>>
>> The details are in the bug report:
>>
>>     JDK-8217659 monitor_logging updates from Async Monitor Deflation 
>> project
>>     https://bugs.openjdk.java.net/browse/JDK-8217659
>>
>> Here's the webrev:
>>
>> http://cr.openjdk.java.net/~dcubed/8217659-webrev/0-for-jdk13/
>>
>> This patch along with the other two patches for Async Monitor Deflation
>> project have been through Mach5 
>> builds-tier1,hs-tier1,jdk-tier1,hs-tier2,hs-tier3
>> testing and I'm currently running my stress testing kits on my Linux-X64
>> and Solaris-X64 servers.
>>
>> I have been actively using this new logging code while debugging my
>> port of the Async Monitor Deflation project code.
>>
>> Thanks, in advance, for any questions, comments or suggestions.
>>
>> Dan
>>
>



More information about the hotspot-runtime-dev mailing list