From 036c80844e30559bdced3587bb70b29ee38af498 Mon Sep 17 00:00:00 2001 From: Nick Gasson Date: Thu, 12 Jan 2023 09:28:46 +0000 Subject: [PATCH] 8298482: Implement ParallelGC NUMAStats for Linux Reviewed-by: ayang, sjohanss, tschatzl --- src/hotspot/os/aix/os_aix.cpp | 4 +- src/hotspot/os/bsd/os_bsd.cpp | 4 +- src/hotspot/os/linux/os_linux.cpp | 11 ++-- src/hotspot/os/windows/os_windows.cpp | 2 +- .../share/gc/parallel/mutableNUMASpace.cpp | 58 +++++++------------ .../share/gc/parallel/mutableNUMASpace.hpp | 5 +- src/hotspot/share/runtime/os.hpp | 4 +- 7 files changed, 34 insertions(+), 54 deletions(-) diff --git a/src/hotspot/os/aix/os_aix.cpp b/src/hotspot/os/aix/os_aix.cpp index ff7eefa7f7d..f11ddabeacf 100644 --- a/src/hotspot/os/aix/os_aix.cpp +++ b/src/hotspot/os/aix/os_aix.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2023, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2012, 2021 SAP SE. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * @@ -1872,7 +1872,7 @@ int os::numa_get_group_id_for_address(const void* address) { return 0; } -bool os::get_page_info(char *start, page_info* info) { +bool os::numa_get_group_ids_for_range(const void** addresses, int* lgrp_ids, size_t count) { return false; } diff --git a/src/hotspot/os/bsd/os_bsd.cpp b/src/hotspot/os/bsd/os_bsd.cpp index c9b21f2cabb..439d1eee73c 100644 --- a/src/hotspot/os/bsd/os_bsd.cpp +++ b/src/hotspot/os/bsd/os_bsd.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2023, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -1575,7 +1575,7 @@ int os::numa_get_group_id_for_address(const void* address) { return 0; } -bool os::get_page_info(char *start, page_info* info) { +bool os::numa_get_group_ids_for_range(const void** addresses, int* lgrp_ids, size_t count) { return false; } diff --git a/src/hotspot/os/linux/os_linux.cpp b/src/hotspot/os/linux/os_linux.cpp index 7d9636d250a..0d261adf93c 100644 --- a/src/hotspot/os/linux/os_linux.cpp +++ b/src/hotspot/os/linux/os_linux.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2023, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2015, 2022 SAP SE. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * @@ -2777,6 +2777,11 @@ int os::numa_get_group_id_for_address(const void* address) { return id; } +bool os::numa_get_group_ids_for_range(const void** addresses, int* lgrp_ids, size_t count) { + void** pages = const_cast(addresses); + return os::Linux::numa_move_pages(0, count, pages, NULL, lgrp_ids, 0) == 0; +} + int os::Linux::get_existing_num_nodes() { int node; int highest_node_number = Linux::numa_max_node(); @@ -2807,10 +2812,6 @@ size_t os::numa_get_leaf_groups(int *ids, size_t size) { return i; } -bool os::get_page_info(char *start, page_info* info) { - return false; -} - char *os::scan_pages(char *start, char* end, page_info* page_expected, page_info* page_found) { return end; diff --git a/src/hotspot/os/windows/os_windows.cpp b/src/hotspot/os/windows/os_windows.cpp index 1d2954014a3..a027587f5f7 100644 --- a/src/hotspot/os/windows/os_windows.cpp +++ b/src/hotspot/os/windows/os_windows.cpp @@ -3727,7 +3727,7 @@ int os::numa_get_group_id_for_address(const void* address) { return 0; } -bool os::get_page_info(char *start, page_info* info) { +bool os::numa_get_group_ids_for_range(const void** addresses, int* lgrp_ids, size_t count) { return false; } diff --git a/src/hotspot/share/gc/parallel/mutableNUMASpace.cpp b/src/hotspot/share/gc/parallel/mutableNUMASpace.cpp index 4e11f60200e..e77aba9c1f0 100644 --- a/src/hotspot/share/gc/parallel/mutableNUMASpace.cpp +++ b/src/hotspot/share/gc/parallel/mutableNUMASpace.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2006, 2023, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -376,12 +376,6 @@ void MutableNUMASpace::update() { } } - if (NUMAStats) { - for (int i = 0; i < lgrp_spaces()->length(); i++) { - lgrp_spaces()->at(i)->accumulate_statistics(page_size()); - } - } - scan_pages(NUMAPageScanRate); } @@ -405,12 +399,6 @@ void MutableNUMASpace::accumulate_statistics() { } increment_samples_count(); } - - if (NUMAStats) { - for (int i = 0; i < lgrp_spaces()->length(); i++) { - lgrp_spaces()->at(i)->accumulate_statistics(page_size()); - } - } } // Get the current size of a chunk. @@ -870,14 +858,11 @@ void MutableNUMASpace::print_on(outputStream* st) const { lgrp_spaces()->at(i)->accumulate_statistics(page_size()); } st->print(" local/remote/unbiased/uncommitted: " SIZE_FORMAT "K/" - SIZE_FORMAT "K/" SIZE_FORMAT "K/" SIZE_FORMAT - "K, large/small pages: " SIZE_FORMAT "/" SIZE_FORMAT "\n", + SIZE_FORMAT "K/" SIZE_FORMAT "K/" SIZE_FORMAT "K\n", ls->space_stats()->_local_space / K, ls->space_stats()->_remote_space / K, ls->space_stats()->_unbiased_space / K, - ls->space_stats()->_uncommited_space / K, - ls->space_stats()->_large_pages, - ls->space_stats()->_small_pages); + ls->space_stats()->_uncommited_space / K); } } } @@ -895,28 +880,25 @@ void MutableNUMASpace::LGRPSpace::accumulate_statistics(size_t page_size) { clear_space_stats(); char *start = (char*)align_up(space()->bottom(), page_size); char* end = (char*)align_down(space()->end(), page_size); - if (start < end) { - for (char *p = start; p < end;) { - os::page_info info; - if (os::get_page_info(p, &info)) { - if (info.size > 0) { - if (info.size > (size_t)os::vm_page_size()) { - space_stats()->_large_pages++; - } else { - space_stats()->_small_pages++; - } - if (info.lgrp_id == lgrp_id()) { - space_stats()->_local_space += info.size; - } else { - space_stats()->_remote_space += info.size; - } - p += info.size; - } else { - p += os::vm_page_size(); + for (char *p = start; p < end; ) { + static const size_t PagesPerIteration = 128; + const void* pages[PagesPerIteration]; + int lgrp_ids[PagesPerIteration]; + + size_t npages = 0; + for (; npages < PagesPerIteration && p < end; p += os::vm_page_size()) { + pages[npages++] = p; + } + + if (os::numa_get_group_ids_for_range(pages, lgrp_ids, npages)) { + for (size_t i = 0; i < npages; i++) { + if (lgrp_ids[i] < 0) { space_stats()->_uncommited_space += os::vm_page_size(); + } else if (lgrp_ids[i] == lgrp_id()) { + space_stats()->_local_space += os::vm_page_size(); + } else { + space_stats()->_remote_space += os::vm_page_size(); } - } else { - return; } } } diff --git a/src/hotspot/share/gc/parallel/mutableNUMASpace.hpp b/src/hotspot/share/gc/parallel/mutableNUMASpace.hpp index 881f280c4b4..2e2e54bd3cd 100644 --- a/src/hotspot/share/gc/parallel/mutableNUMASpace.hpp +++ b/src/hotspot/share/gc/parallel/mutableNUMASpace.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2006, 2023, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -73,15 +73,12 @@ class MutableNUMASpace : public MutableSpace { struct SpaceStats { size_t _local_space, _remote_space, _unbiased_space, _uncommited_space; - size_t _large_pages, _small_pages; SpaceStats() { _local_space = 0; _remote_space = 0; _unbiased_space = 0; _uncommited_space = 0; - _large_pages = 0; - _small_pages = 0; } }; diff --git a/src/hotspot/share/runtime/os.hpp b/src/hotspot/share/runtime/os.hpp index 5459ff3b233..fc97d59d263 100644 --- a/src/hotspot/share/runtime/os.hpp +++ b/src/hotspot/share/runtime/os.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -500,13 +500,13 @@ class os: AllStatic { static bool numa_topology_changed(); static int numa_get_group_id(); static int numa_get_group_id_for_address(const void* address); + static bool numa_get_group_ids_for_range(const void** addresses, int* lgrp_ids, size_t count); // Page manipulation struct page_info { size_t size; int lgrp_id; }; - static bool get_page_info(char *start, page_info* info); static char* scan_pages(char *start, char* end, page_info* page_expected, page_info* page_found); static char* non_memory_address_word();