RFR(XL): 8220310: Implementation: NUMA-Aware Memory Allocation for G1, Mutator (1/3)

Stefan Johansson stefan.johansson at oracle.com
Wed Oct 9 21:40:37 UTC 2019

Hi Sangheon,

Thanks again for a much improved version. Some comments below.

> 9 okt. 2019 kl. 06:27 skrev sangheon.kim at oracle.com:
> ...
> Here's the major change list at the webrev. Or arguable list :)
> 1) Verification at HRM::allocate_free_region() is removed and it will be added somewhere at safepoint by JDK-8220312 (3/3 which is part of this JEP). Probably at the end of young gc?
> 2) Node id printing is changed. Removed old one and added at HeapRegion::print_on() with new column. Node id is only printed when UseNUMA is enabled and gc+heap+region=trace. If there's single active node, it will print the node id and this is intentional. Another approach would be printing only if there are multiple nodes.
> 3) If AlwaysPreTouch is enabled, HeapRegion will have actual node index instead of preferred node index.
> 4) HeapRegion::_node_index is set at HRM::make_regions_available() as there is the only place initializing HeapRegion. Another approach would be setting the index at HeapRegion::initialize(we have to pollute HR with G1MNM stuff) or conditionally(*) setting the index at HeapRegion::node_index(). (*) if the index is unknown etc..
> 5) G1NUMA class is merged into G1MemoryNodeManager.

I saw your comment above about suggestions around this area and I can try out one thought I had, something I think Thomas mentioned as well. Making the non-NUMA case work exactly as a the NUMA case with one node. I’ll need some more time for that, but below are my comments on the current patch.

> Webrev:
> http://cr.openjdk.java.net/~sangheki/8220310/webrev.3
> http://cr.openjdk.java.net/~sangheki/8220310/webrev.3.inc

3026     warning("Failed to get numa id at " PTR_FORMAT " with errno=%d", p2i((void*)address), errno);

The cast here is no longer needed.

 44   G1MemoryNodeManager* _mnm;

I would prefer a more descriptive name like _memory_node_manager.

 196   // Manages single or multi node memory.
 197   G1MemoryNodeManager* _mem_node_mgr;
 558   G1MemoryNodeManager* mem_node_mgr() const { return _mem_node_mgr; }

As above, I would prefer spelling out the names to memory_node_manager().

Last line still removed a ’\’, please revert this change.

 462   if (UseNUMA) {
 463     const int* node_ids = G1MemoryNodeManager::mgr()->node_ids();
 464     st->print("|Node ID %02d", node_ids[this->node_index()]);
 465   }
 466   st->print_cr("”);

I would prefer having a function that returns the node id given the index. Like the inverse of index_of_node_id(). 

I also think it would be more informative to say "NUMA id" or "NUMA node”.

 195 // Set node index of the given HeapRegion.
 196 // If AlwaysPreTouch is enabled, set with actual node index.
 197 // If it is disabled, set with preferred node index which is already decided.
 198 static void set_heapregion_node_index(HeapRegion* hr) {
 199   uint node_index;
 200   if(AlwaysPreTouch) {
 201     // If we already pretouched, we can check actual node index here.
 202     node_index = G1MemoryNodeManager::mgr()->index_of_address(hr->bottom());
 203   } else {
 204     node_index = G1MemoryNodeManager::mgr()->preferred_node_index_for_index(hr->hrm_index());
 205   }
 206   hr->set_node_index(node_index);
 207 }

I would prefer to have a helper for calculating the index to set not a helper for setting the index. If you agree, you could move this logic to G1MemoryNodeManager::index_for_region() and then you can change:
 233     // Set node index of the heap region after initialization but before inserting
 234     // to free list.
 235     set_heapregion_node_index(hr);

To just:
 235     hr->set_node_index(G1MemoryNodeManager::mgr()->index_for_region(hr));
 309  bool HeapRegionManager::is_on_preferred_index(uint region_index, uint preferred_node_index) {
 310    uint region_node_index = G1MemoryNodeManager::mgr()->preferred_node_index_for_index(region_index);
 311   return region_node_index == preferred_node_index;
 312  }

Indentation on row 311.

 44   static G1MemoryNodeManager* mgr() { return _inst; }

I think we should change the name of this getter to manager(), to avoid unnecessary shortenings. 
57   virtual bool has_multi_nodes() const { return false; }

Same as above I would prefer has_multiple_nodes()


> Testing: hs-tier 1~5, with/without UseNUMA
> Thanks,
> Sangheon

More information about the hotspot-runtime-dev mailing list