comparison src/os/linux/vm/os_linux.cpp @ 12832:263f2c796d6c

8024838: Significant slowdown due to transparent huge pages Summary: Don't turn on transparent huge pages (-XX:+UseTransparentHugePages) unless explicitly specified on the command line. This has the effect that large pages are never turned on Linux unless the user has explicitly enabled any of the large pages flags: -XX:+UseLargePages, -XX:+UseTransparentHugePages, -XX:+UseHugeTLBFS, and -XX:+UseSHM. Reviewed-by: jwilhelm, tschatzl, brutisso
author stefank
date Sat, 05 Oct 2013 10:14:58 +0200
parents 06ae47d9d088
children aa6f2ea19d8f
comparison
equal deleted inserted replaced
12830:9b4d0569f2f4 12832:263f2c796d6c
3359 3359
3360 bool os::Linux::setup_large_page_type(size_t page_size) { 3360 bool os::Linux::setup_large_page_type(size_t page_size) {
3361 if (FLAG_IS_DEFAULT(UseHugeTLBFS) && 3361 if (FLAG_IS_DEFAULT(UseHugeTLBFS) &&
3362 FLAG_IS_DEFAULT(UseSHM) && 3362 FLAG_IS_DEFAULT(UseSHM) &&
3363 FLAG_IS_DEFAULT(UseTransparentHugePages)) { 3363 FLAG_IS_DEFAULT(UseTransparentHugePages)) {
3364 // If UseLargePages is specified on the command line try all methods, 3364
3365 // if it's default, then try only UseTransparentHugePages. 3365 // The type of large pages has not been specified by the user.
3366 if (FLAG_IS_DEFAULT(UseLargePages)) { 3366
3367 UseTransparentHugePages = true; 3367 // Try UseHugeTLBFS and then UseSHM.
3368 } else { 3368 UseHugeTLBFS = UseSHM = true;
3369 UseHugeTLBFS = UseTransparentHugePages = UseSHM = true; 3369
3370 } 3370 // Don't try UseTransparentHugePages since there are known
3371 // performance issues with it turned on. This might change in the future.
3372 UseTransparentHugePages = false;
3371 } 3373 }
3372 3374
3373 if (UseTransparentHugePages) { 3375 if (UseTransparentHugePages) {
3374 bool warn_on_failure = !FLAG_IS_DEFAULT(UseTransparentHugePages); 3376 bool warn_on_failure = !FLAG_IS_DEFAULT(UseTransparentHugePages);
3375 if (transparent_huge_pages_sanity_check(warn_on_failure, page_size)) { 3377 if (transparent_huge_pages_sanity_check(warn_on_failure, page_size)) {
3391 3393
3392 return UseSHM; 3394 return UseSHM;
3393 } 3395 }
3394 3396
3395 void os::large_page_init() { 3397 void os::large_page_init() {
3396 if (!UseLargePages) { 3398 if (!UseLargePages &&
3399 !UseTransparentHugePages &&
3400 !UseHugeTLBFS &&
3401 !UseSHM) {
3402 // Not using large pages.
3403 return;
3404 }
3405
3406 if (!FLAG_IS_DEFAULT(UseLargePages) && !UseLargePages) {
3407 // The user explicitly turned off large pages.
3408 // Ignore the rest of the large pages flags.
3409 UseTransparentHugePages = false;
3397 UseHugeTLBFS = false; 3410 UseHugeTLBFS = false;
3398 UseTransparentHugePages = false;
3399 UseSHM = false; 3411 UseSHM = false;
3400 return; 3412 return;
3401 } 3413 }
3402 3414
3403 size_t large_page_size = Linux::setup_large_page_size(); 3415 size_t large_page_size = Linux::setup_large_page_size();