Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1uZt56-009ZPJ-G4 for pgsql-hackers@arkaria.postgresql.org; Thu, 10 Jul 2025 15:21:04 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.94.2) (envelope-from ) id 1uZt52-00E3nm-VK for pgsql-hackers@arkaria.postgresql.org; Thu, 10 Jul 2025 15:21:01 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1uZt52-00E3nd-Cs for pgsql-hackers@lists.postgresql.org; Thu, 10 Jul 2025 15:21:01 +0000 Received: from relay16.mail.gandi.net ([217.70.178.236]) by makus.postgresql.org with smtp (Exim 4.96) (envelope-from ) id 1uZt50-006are-1y for pgsql-hackers@lists.postgresql.org; Thu, 10 Jul 2025 15:20:59 +0000 Received: by mail.gandi.net (Postfix) with ESMTPSA id B3E6C44A0C; Thu, 10 Jul 2025 15:20:53 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=vondra.me; s=gm1; t=1752160855; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=c3FcmBoE/bS7CDByAeluX5/8eeHrYz8sP7bIhV8jFLw=; b=X3u1JuhEF6j8ak6wLUxVlaaM+admRW+rS1yI0a7oJP68d7WN7vM9Uaxc68SMLP4ecz3q6i yNVcMsjet5/4l/5cEfmA4pW3gztGHs/yPBPg6gENgnwmlt6zDxyUZzubRHYboN2n8XQB/3 h9Zyh3uXYo5l0Wu2qay2njDwH7vL24uMJq9CRge7AKdr4ynVKYLqmlDLy78vEYr9orED9U FYjSAFVVG9Z8tedlp5wdaNWK+8syWSoTaA9+mKMAlJIKcsXlxPWfRJ8CXuZS0DqIXzST5s AdC6VTdHw7jjSg631V9BeAz4j8ebydHi81s8HccYjiWtlXgk2r1J1YYCuK4aKQ== Message-ID: <20537e21-3a32-4941-91eb-20bdfdb96e26@vondra.me> Date: Thu, 10 Jul 2025 17:20:50 +0200 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: Adding basic NUMA awareness - Preliminary feedback and outline for an extensible approach To: =?UTF-8?Q?C=C3=A9dric_Villemain?= , Andres Freund Cc: PostgreSQL Hackers References: <099b9433-2855-4f1b-b421-d078a5d82017@vondra.me> <1caea3b1-3e0b-4bdb-a630-75671f1f837a@data-bene.io> <949e555b-84ed-4f8f-863e-f88a15781142@vondra.me> <89c1f26c-977f-44e2-9d78-ddff7c8268b2@vondra.me> Content-Language: en-US From: Tomas Vondra In-Reply-To: Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-GND-State: clean X-GND-Score: -100 X-GND-Cause: gggruggvucftvghtrhhoucdtuddrgeeffedrtdefgdegtdejkecutefuodetggdotefrodftvfcurfhrohhfihhlvgemucfitefpfffkpdcuggftfghnshhusghstghrihgsvgenuceurghilhhouhhtmecufedtudenucesvcftvggtihhpihgvnhhtshculddquddttddmnecujfgurhepkfffgggfuffvvehfhfgjtgfgsehtkeertddtvdejnecuhfhrohhmpefvohhmrghsucggohhnughrrgcuoehtohhmrghssehvohhnughrrgdrmhgvqeenucggtffrrghtthgvrhhnpeeuvddvieefffefkedugefgtdeigeelgfegudehffevieehgffghefgvdduteffveenucfkphepkeeirdegledrvdeftddrvddtieenucevlhhushhtvghrufhiiigvpedtnecurfgrrhgrmhepihhnvghtpeekiedrgeelrddvfedtrddvtdeipdhhvghloheplgdutddrudefjedrtddrvdgnpdhmrghilhhfrhhomhepthhomhgrshesvhhonhgurhgrrdhmvgdpnhgspghrtghpthhtohepfedprhgtphhtthhopegtvggurhhitgdrvhhilhhlvghmrghinhesuggrthgrqdgsvghnvgdrihhopdhrtghpthhtoheprghnughrvghssegrnhgrrhgriigvlhdruggvpdhrtghpthhtohepphhgshhqlhdqhhgrtghkvghrsheslhhishhtshdrphhoshhtghhrvghsqhhlrdhorhhg List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk On 7/9/25 08:40, Cédric Villemain wrote: >> On 7/8/25 18:06, Cédric Villemain wrote: >>> >>> >>> >>> >>> >>> >>>> On 7/8/25 03:55, Cédric Villemain wrote: >>>>> Hi Andres, >>>>> >>>>>> Hi, >>>>>> >>>>>> On 2025-07-05 07:09:00 +0000, Cédric Villemain wrote: >>>>>>> In my work on more careful PostgreSQL resource management, I've come >>>>>>> to the >>>>>>> conclusion that we should avoid pushing policy too deeply into the >>>>>>> PostgreSQL core itself. Therefore, I'm quite skeptical about >>>>>>> integrating >>>>>>> NUMA-specific management directly into core PostgreSQL in such a >>>>>>> way. >>>>>> >>>>>> I think it's actually the opposite - whenever we pushed stuff like >>>>>> this >>>>>> outside of core it has hurt postgres substantially. Not having >>>>>> replication in >>>>>> core was a huge mistake. Not having HA management in core is >>>>>> probably the >>>>>> biggest current adoption hurdle for postgres. >>>>>> >>>>>> To deal better with NUMA we need to improve memory placement and >>>>>> various >>>>>> algorithms, in an interrelated way - that's pretty much impossible >>>>>> to do >>>>>> outside of core. >>>>> >>>>> Except the backend pinning which is easy to achieve, thus my >>>>> comment on >>>>> the related patch. >>>>> I'm not claiming NUMA memory and all should be managed outside of core >>>>> (though I didn't read other patches yet). >>>>> >>>> >>>> But an "optimal backend placement" seems to very much depend on >>>> where we >>>> placed the various pieces of shared memory. Which the external module >>>> will have trouble following, I suspect. >>>> >>>> I still don't have any idea what exactly would the external module do, >>>> how would it decide where to place the backend. Can you describe some >>>> use case with an example? >>>> >>>> Assuming we want to actually pin tasks from within Postgres, what I >>>> think might work is allowing modules to "advise" on where to place the >>>> task. But the decision would still be done by core. >>> >>> Possibly exactly what you're doing in proc.c when managing allocation of >>> process, but not hardcoded in postgresql (patches 02, 05 and 06 are good >>> candidates), I didn't get that they require information not available to >>> any process executing code from a module. >>> >> >> Well, it needs to understand how some other stuff (especially PGPROC >> entries) is distributed between nodes. I'm not sure how much of this >> internal information we want to expose outside core ... >> >>> Parts of your code where you assign/define policy could be in one or >>> more relevant routines of a "numa profile manager", like in an >>> initProcessRoutine(), and registered in pmroutine struct: >>> >>> pmroutine = GetPmRoutineForInitProcess(); >>> if (pmroutine != NULL && >>>      pmroutine->init_process != NULL) >>>      pmroutine->init_process(MyProc); >>> >>> This way it's easier to manage alternative policies, and also to be able >>> to adjust when hardware and linux kernel changes. >>> >> >> I'm not against making this extensible, in some way. But I still >> struggle to imagine a reasonable alternative policy, where the external >> module gets the same information and ends up with a different decision. >> >> So what would the alternate policy look like? What use case would the >> module be supporting? > > > That's the whole point: there are very distinct usages of PostgreSQL in > the field. And maybe not all of them will require the policy defined by > PostgreSQL core. > > May I ask the reverse: what prevent external modules from taking those > decisions ? There are already a lot of area where external code can take > over PostgreSQL processing, like Neon is doing. > The complexity of making everything extensible in an arbitrary way. To make it extensible in a useful, we need to have a reasonably clear idea what aspects need to be extensible, and what's the goal. > There are some very early processing for memory setup that I can see as > a current blocker, and here I'd refer a more compliant NUMA api as > proposed by Jakub so it's possible to arrange based on workload, > hardware configuration or other matters. Reworking to get distinct > segment and all as you do is great, and combo of both approach probably > of great interest. There is also this weighted interleave discussed and > probably much more to come in this area in Linux. > > I think some points raised already about possible distinct policies, I > am precisely claiming that it is hard to come with one good policy with > limited setup options, thus requirement to keep that flexible enough > (hooks, api, 100 GUc ?). > I'm sorry, I don't want to sound too negative, but "I want arbitrary extensibility" is not a very useful feedback. I've asked you to give some examples of policies that'd customize some of the NUMA stuff. > There is an EPYC story here also, given the NUMA setup can vary > depending on BIOS setup, associated NUMA policy must probably take that > into account (L3 can be either real cache or 4 extra "local" NUMA nodes > - with highly distinct access cost from a RAM module). > Does that change how PostgreSQL will place memory and process? Is it > important or of interest ? > So how exactly would the policy handle this? Right now we're entirely oblivious to L3, or on-CPU caches in general. We don't even consider the size of L3 when sizing hash tables in a hashjoin etc. regards -- Tomas Vondra