[9] RFR(S): 8064940: JMH javac performance regressions on solaris-sparcv9 in 9-b34

Tobias Hartmann tobias.hartmann at oracle.com
Thu Jan 15 08:58:22 UTC 2015


Hi,

please review the following patch.

https://bugs.openjdk.java.net/browse/JDK-8064940
http://cr.openjdk.java.net/~thartmann/8064940/webrev.01/

Problem:
Promotion testing revealed a performance regression for the JMH-Javac benchmarks
on Solaris Sparc introduced in b34 by JDK-8015774. While investigating, I
noticed that the number of iTLB misses greatly increases with code cache
segmentation enabled (40190 vs. 129806235) causing the regression. This is due
to large page support (-XX:+UseLargePages) being enabled on Sparc.

Without code cache segmentation the single code heap uses only large (4M) pages:

Address              Kbytes        RSS       Anon     Locked Pgsz Mode
FFFFFFFF69000000      32768      32768      32768          -   4M rwx--

iTLB misses: 40190 (one run)

With code cache segmentation the code heaps do not use large pages and due to
JDK-8066875 not even the middle region of the underlying virtual space uses
large pages:

Address              Kbytes        RSS       Anon     Locked Pgsz Mode
FFFFFFFF69000000       4544       4544       4544          -  64K rwx--

FFFFFFFF697CE000          8          8          8          -   8K rwx--
FFFFFFFF697D0000       1984       1984       1984          -  64K rwx--
FFFFFFFF699C0000      16456      16456      16456          -   8K rwx--
FFFFFFFF6A9D2000         48          -          -          -    - rwx--

FFFFFFFF70BE8000         32         32         32          -   8K rwx--
FFFFFFFF70BF0000       1984       1984       1984          -  64K rwx--
FFFFFFFF70DE0000      10040      10040      10040          -   8K rwx--
FFFFFFFF717AE000         40          -          -          -    - rwx--

iTLB misses: 129806235 (one run)

As a result a high number 8K and 64K pages are used to cover the code cache,
resulting in an increased number of iTLB misses, degrading performance.

Solution:
By aligning the code heap sizes to the large page size we make sure that each
code heap can be covered by large pages:

Address              Kbytes        RSS       Anon     Locked Pgsz Mode
FFFFFFFF69000000       8192       8192       8192          -   4M rwx--
FFFFFFFF69800000      16384      16384      16384          -   4M rwx--
FFFFFFFF70C00000       4096       4096       4096          -   4M rwx--

iTLB misses: 40054 (one run)

I also had to adapt the 'print code cache' test because it assumes that the code
heap sizes set on the command line are equal the runtime sizes. This is not true
if we align them to large pages. There is an existing RFE for additional
alignment tests [1] that will cover this case.

Note: The fix depends on [2].

Testing:
- JPRT
- Performance testing (see separate email)
- Manually tested on Windows with large pages enabled

Thanks,
Tobias


[1] https://bugs.openjdk.java.net/browse/JDK-8067135
[2] https://bugs.openjdk.java.net/browse/JDK-8066875


More information about the hotspot-compiler-dev mailing list