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.96) (envelope-from ) id 1wAIXM-002FN6-1n for pgsql-hackers@arkaria.postgresql.org; Wed, 08 Apr 2026 02:21:00 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1wAIXL-0043bq-05 for pgsql-hackers@arkaria.postgresql.org; Wed, 08 Apr 2026 02:20:59 +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.96) (envelope-from ) id 1wAIXK-0043bF-0v for pgsql-hackers@lists.postgresql.org; Wed, 08 Apr 2026 02:20:59 +0000 Received: from fout-a4-smtp.messagingengine.com ([103.168.172.147]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.98.2) (envelope-from ) id 1wAIXI-000000018qY-3AJl for pgsql-hackers@lists.postgresql.org; Wed, 08 Apr 2026 02:20:57 +0000 Received: from phl-compute-02.internal (phl-compute-02.internal [10.202.2.42]) by mailfout.phl.internal (Postfix) with ESMTP id 6D2DDEC04B6; Tue, 7 Apr 2026 22:20:56 -0400 (EDT) Received: from phl-frontend-04 ([10.202.2.163]) by phl-compute-02.internal (MEProxy); Tue, 07 Apr 2026 22:20:56 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=anarazel.de; h= cc:cc:content-transfer-encoding:content-type:content-type:date :date:from:from:in-reply-to:in-reply-to:message-id:mime-version :references:reply-to:subject:subject:to:to; s=fm2; t=1775614856; x=1775701256; bh=XtvwfiLEhtqAEKbiewjxAtgsX0Bu+YDo2/mGmQ03TTU=; b= kvLwJ+25PQlFxOagj+dOlbm3gsXfv/5Y9qRGMu9ZRG8RoA4EMgLDTRPhTSA3YtTd EwVFz4OA5l5JFjaMmBExxBtE221v84DgpMwQ4fvXZz5epLk0RddXGvXE/+IxiJ9V MrG15U8Qkz9Lj5mVj0b3V8MnVr9uz5oQoh/M0ARjYTHtT/CCkv0qz4tmNrPxfM1p xj4jlJvqkD3XcscTEHrKv1kd5opEPtoCde3XS9TmgdVsGmjdYj1X+N0zwlqBP/+d cCUMGEGtzv/1EzLL4fQeMrWA8SEuqTooIGIzszcqcllXnaBVWEHIClQr8SaUKjYy vH/2qoA9v2v16W9d2+jhOg== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-transfer-encoding :content-type:content-type:date:date:feedback-id:feedback-id :from:from:in-reply-to:in-reply-to:message-id:mime-version :references:reply-to:subject:subject:to:to:x-me-proxy :x-me-sender:x-me-sender:x-sasl-enc; s=fm2; t=1775614856; x= 1775701256; bh=XtvwfiLEhtqAEKbiewjxAtgsX0Bu+YDo2/mGmQ03TTU=; b=R 7dZOh1vnzp4HX5e9KXKes9eAzd3I3gQ2tf2xZn06SReoGX0RPrvKbLP+vsFnxUoU VCAOM9y5BWyTO8eIlPDhtwN5/ruiv7zf7UBC04N+h8NoooL8FzrPcVSnYB4c7s+j qfiE8h28UbKbix5GUMTqzLrQbFYAstgYgs3p1/KAGNUWhZzDZjpGwqhQMokm90vm H5dPN979puTNBmvtTyio2nC+zfxskFDM8jYCLhcQeeFynmHNvpJ/w+75lfXF7P9d Xk3lY/CpjUe1RH0bI6lGM9rStF3bBfNxvnWhGOv2775+qTHPDA/XyiX/SwUIFQ2y fFJSgenwjEVLs5lGFaUeA== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeefhedrtddtgddvvdefhecutefuodetggdotefrod ftvfcurfhrohhfihhlvgemucfhrghsthforghilhdpuffrtefokffrpgfnqfghnecuuegr ihhlohhuthemuceftddtnecusecvtfgvtghiphhivghnthhsucdlqddutddtmdenucfjug hrpeffhffvvefukfhfgggtugfgjgestheksfdttddtjeenucfhrhhomheptehnughrvghs ucfhrhgvuhhnugcuoegrnhgurhgvshesrghnrghrrgiivghlrdguvgeqnecuggftrfgrth htvghrnheptdelledvgfejvdffieeukeefueelfffhgeffhffgffekveeuheeihefhiefg hfdvnecuvehluhhsthgvrhfuihiivgeptdenucfrrghrrghmpehmrghilhhfrhhomheprg hnughrvghssegrnhgrrhgriigvlhdruggvpdhnsggprhgtphhtthhopeefpdhmohguvgep shhmthhpohhuthdprhgtphhtthhopeelvghrthhhrghlihhonheisehgmhgrihhlrdgtoh hmpdhrtghpthhtohepthhhohhmrghsrdhmuhhnrhhosehgmhgrihhlrdgtohhmpdhrtghp thhtohepphhgshhqlhdqhhgrtghkvghrsheslhhishhtshdrphhoshhtghhrvghsqhhlrd horhhg X-ME-Proxy: Feedback-ID: id4a34324:Fastmail Received: by mail.messagingengine.com (Postfix) with ESMTPA; Tue, 7 Apr 2026 22:20:56 -0400 (EDT) Date: Tue, 7 Apr 2026 22:20:55 -0400 From: Andres Freund To: Thomas Munro Cc: Dmitry Dolgov <9erthalion6@gmail.com>, PostgreSQL Hackers Subject: Re: Automatically sizing the IO worker pool Message-ID: References: <20260328095204.5tsq5bldugeumrtf@erthalion> <4vhrgxmx5w4cjr7vgegur3hbkuojt2iz23v4dqfypsgvl5bszi@xrxefkkcxdja> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk Hi, On 2026-04-08 14:09:16 +1200, Thomas Munro wrote: > On Wed, Apr 8, 2026 at 12:30 PM Andres Freund wrote: > > On 2026-04-08 11:18:51 +1200, Thomas Munro wrote: > > > > /* Choose one worker to wake for this batch. */ > > > > if (worker == -1) > > > > worker = pgaio_worker_choose_idle(-1); > > > > > > Well I didn't want to wake a worker if we'd failed to enqueue > > > anything. > > > > I think it's worth waking up workers if there are idle ones and the queue is > > full? > > True, but I prefer to test nsync because there is another reason to break: I don't follow. What I was proposing is after the conditional lock acquisition succeeded. So is your nsync == 0 check. > +/* > + * Tell postmaster that we think a new worker is needed. > + */ > +static void > +pgaio_worker_request_grow(void) > +{ > + /* > + * Suppress useless signaling if we already know that we're at the > + * maximum. This uses an unlocked read of nworkers, but that's OK for > + * this heuristic purpose. > + */ > + if (io_worker_control->nworkers < io_max_workers) > { > - io_worker_control->workers[i].latch = NULL; > - io_worker_control->workers[i].in_use = false; > + if (!io_worker_control->grow) > + { > + io_worker_control->grow = true; > + pg_memory_barrier(); > + > + /* > + * If the postmaster has already been signaled, don't do it again > + * until the postmaster clears this flag. There is no point in > + * repeated signals if grow is being set and cleared repeatedly > + * while the postmaster is waiting for io_worker_launch_interval > + * (which it applies even to canceled requests). > + */ > + if (!io_worker_control->grow_signal_sent) > + { > + io_worker_control->grow_signal_sent = true; > + pg_memory_barrier(); > + SendPostmasterSignal(PMSIGNAL_IO_WORKER_GROW); > + } > + } > } > } I'd probbly use early returns to make it a bit more readable. > +static bool > +pgaio_worker_can_timeout(void) > +{ > + PgAioWorkerSet workerset; > + > + /* Serialize against pool size changes. */ > + LWLockAcquire(AioWorkerControlLock, LW_SHARED); > + workerset = io_worker_control->workerset; > + LWLockRelease(AioWorkerControlLock); > + > + if (MyIoWorkerId != pgaio_workerset_get_highest(&workerset)) > + return false; > + > + if (MyIoWorkerId < io_min_workers) > + return false; > + > + return true; > +} I guess I'd move the < io_min_workers to earlier so that you don't acquire the lock if that'll return false anyway. Greetings, Andres Freund