Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.89) (envelope-from ) id 1gR64n-000323-SC for pgsql-hackers@arkaria.postgresql.org; Mon, 26 Nov 2018 01:52:42 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.89) (envelope-from ) id 1gR64m-0008Ge-Ah for pgsql-hackers@arkaria.postgresql.org; Mon, 26 Nov 2018 01:52:40 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.89) (envelope-from ) id 1gR64l-0008GX-Up for pgsql-hackers@lists.postgresql.org; Mon, 26 Nov 2018 01:52:40 +0000 Received: from mail-wr1-x441.google.com ([2a00:1450:4864:20::441]) by magus.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.89) (envelope-from ) id 1gR64i-0001MD-LW for pgsql-hackers@postgresql.org; Mon, 26 Nov 2018 01:52:39 +0000 Received: by mail-wr1-x441.google.com with SMTP id v13so13752015wrw.5 for ; Sun, 25 Nov 2018 17:52:36 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=2ndquadrant-com.20150623.gappssmtp.com; s=20150623; h=subject:from:to:cc:references:message-id:date:user-agent :mime-version:in-reply-to:content-language; bh=yD4rCO10mp6iQXsboiPX4RVwGKtm65n3CZeLvEX98iw=; b=SvxOQ+mECFRN1kJolKjcLpxMNjDMuiMsORc7yGYx2Udt2mrclPcZp3ydRhlFKsXpVd P61cBquJ/TH+3qJpw222uc3lm9YBr8QbuNRegs4oZDrXaQRLMeE31wYw6/GVYxLH/Ah9 yzpCYiwKH51Nsopsfvw5vsmPHQe26D6t/koS4Cwsq5WYx1/5uJZqGFbSiUIxpVq1HjgT 6HhjF1abqpuzZccPUW7ihug2USn/LLLJq3ewJQhlFtkdZ/Hy3IGifbXO+YnbFbfeMsow yAUgz1wjblycn/a66nN2NMvqxKnVzfuLsJ8KhE+gR3jlP2AsDbNSOjq3n0jNxZuxjr1S OFJg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:subject:from:to:cc:references:message-id:date :user-agent:mime-version:in-reply-to:content-language; bh=yD4rCO10mp6iQXsboiPX4RVwGKtm65n3CZeLvEX98iw=; b=JpQmkPFZzZyMyLOTyVG/1zvuUCGXaBU1rQG8TSz8LPZaxoTyPtLpT0QU8uqEFcoBlV W3FzS5VeNCqOz05uP4MNr2sW0WCQC21SRoglqFXoPfbM2VpG4Q0VtvxBE3R6y+F7NyCp NpaNFGQLnl2ytjWs1milZcedfusNbaEY2Tn8egO3xHdoMIFiYLpr+/Z6h9VLQQFwY+Xv vj1nhff0IEkFd3BbPY0h4C8t/Osv1QNGP95ddt/hT8/z4RTKk3WPpyc7Kswigfr6LkIj wAPTycIw2tJhd62P117cgoQ3nxN9129m+VuT+9JHkZaWpIy3t/KckMqEecTelpa/3hHM UaMQ== X-Gm-Message-State: AA+aEWYrbgVHWtC/OLmH+Z7Dx1QH9VSm50OydzkfPfjAsXHnCYY/bs54 vcRwF8lFvFeKsc0UCyo+qMEOdI+FwiZBZec5yq2ErtQN6J2ihfmuOohBocgKtgotS7NRiYFVF+S 4ZG1bq398LLSYxq046O0UIrTNzJONatH/ruhsUpoysErTKSGgvkVZynD8zC4D0tKS5AsmJ28kE+ 4j1o7MO0Fr2WApYQ== X-Google-Smtp-Source: AFSGD/VEVNUD/z0HWuG42hnL+g6lyJudFtIEeyzr7jBB68fEMK9scMQXiS7x1mxoS+GoAM1ydysu5A== X-Received: by 2002:adf:8143:: with SMTP id 61mr262014wrm.47.1543197154915; Sun, 25 Nov 2018 17:52:34 -0800 (PST) Received: from [10.137.2.19] (ip-86-49-251-50.net.upcbroadband.cz. [86.49.251.50]) by smtp.gmail.com with ESMTPSA id m126sm12779887wmb.30.2018.11.25.17.52.33 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 25 Nov 2018 17:52:33 -0800 (PST) Subject: Re: shared-memory based stats collector From: Tomas Vondra To: Kyotaro HORIGUCHI Cc: alvherre@2ndquadrant.com, andres@anarazel.de, ah@cybertec.at, magnus@hagander.net, robertmhaas@gmail.com, tgl@sss.pgh.pa.us, pgsql-hackers@postgresql.org References: <20181108153941.txjb6rg3y7q26ldm@alvherre.pgsql> <20181109.173315.29453727.horiguchi.kyotaro@lab.ntt.co.jp> <803f2d96-3b4b-f357-9a2e-45443212f13d@2ndquadrant.com> <20181112.201042.147595779.horiguchi.kyotaro@lab.ntt.co.jp> <8e041a34a70ae5d44cb10a7e516308e2f6d1b651.camel@2ndquadrant.com> Message-ID: <6c079a69-feba-e47c-7b85-8a9ff31adef3@2ndquadrant.com> Date: Mon, 26 Nov 2018 02:52:30 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.3.0 MIME-Version: 1.0 In-Reply-To: <8e041a34a70ae5d44cb10a7e516308e2f6d1b651.camel@2ndquadrant.com> Content-Type: multipart/mixed; boundary="------------E1B83F73CCBC07C9A3D11A9C" Content-Language: en-US List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Precedence: bulk This is a multi-part message in MIME format. --------------E1B83F73CCBC07C9A3D11A9C Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit Hi, Unfortunately, the patch does not apply anymore - it seems it got broken by the changes to signal handling and/or removal of magic OIDs :-( I've done a review and testing when applied on top of 10074651e335. Firstly, the testing - I was wondering if the patch has some performance impact, so I've done some testing with a read-only workload on large number of tables (1k, 10k and 100k) while concurrently selecting data from pg_stat_* catalogs at the same time. In one case both workloads were running against the same database, in another there were two separate databases (and the selects from stat catalogs were running against an "empty" database with no use tables). In both cases there were 8 clients doing selects from the user tables, and 4 clients accessing the pg_stat_* catalogs. For the "single database" case the results looks like this (this is just patched / master throughput): # of tables xact stats ------------------------------ 1000 97.71% 98.76% 10000 100.38% 97.97% 100000 100.10% 98.50% xact is throughput of the user workload (select from the large number of tables) and stats is throughput for selects from system catalogs. So pretty much no difference - 2% is within noise on this machine. On two separate databases the results are a bit more interesting: # of tables xact stats ------------------------------- 1000 100.49% 80.38% 10000 103.18% 80.28% 100000 100.85% 81.95% For the main workload there's pretty much no difference, but for selects from the stats catalogs there's ~20% drop in throughput. In absolute numbers this means drop from ~670tps to ~550tps. I haven't investigated this, but I suppose this is due to dshash seqscan being more expensive than reading the data from file. I don't think any of this is an issue in practice, though. The important thing is that there's no measurable impact on the regular workload. Now, a couple of comments regarding individual parts of the patch. 0001-0003 --------- I do think 0001 - 0003 are ready, with some minor cosmetic issues: 1) I'd rephrase the last part of dshash_seq_init comment more like this: * If consistent is set for dshash_seq_init, the all hash table * partitions are locked in the requested mode (as determined by the * exclusive flag), and the locks are held until the end of the scan. * Otherwise the partition locks are acquired and released as needed * during the scan (up to two partitions may be locked at the same time). Maybe it should briefly explain what the consistency guarantees are (and aren't), but considering we're not materially changing the existing behavior probably is not really necessary. 2) I think the dshash_find_extended() signature should be more like dshash_find(), i.e. just appending parameters instead of moving them around unnecessarily. Perhaps we should add Assert(nowait || !lock_acquired); Using nowait=false with lock_acquired!=NULL does not seem sensible. 3) I suppose this comment in postmaster.c is just copy-paste: -#define BACKEND_TYPE_ARCHIVER 0x0010 /* bgworker process */ +#define BACKEND_TYPE_ARCHIVER 0x0010 /* archiver process */ I wonder why wasn't archiver a regular auxiliary process already? It seems like a fairly natural thing, so why not? 0004 (+0005 and 0007) --------------------- This seems fine, but I have my doubts about two changes - removing of stats_temp_directory and the IDLE_STATS_UPDATE_TIMEOUT thingy. There's a couple of issues with the stats_temp_directory. Firstly, I don't understand why it's spread over multiple parts of the patch. The GUC is removed in 0004, the underlying variable is removed in 0005 and then the docs are updated in 0007. If we really want to do this, it should happen in a single patch. But the main question is - do we really want to do that? I understand this directory was meant for the stats data we're moving to shared memory, so removing it seems natural. But clearly it's used by pg_stat_statements - 0005 fixes that, of course, but I wonder if there are other extensions using it to store files? It's not just about how intensive I/O to those files is, but this also means the files will now be included in backups / pg_rewind, and maybe that's not really desirable? Maybe it's fine but I'm not quite convinced about it ... I'm not sure I understand what IDLE_STATS_UPDATE_TIMEOUT does. You've described it as This adds a new timeout IDLE_STATS_UPDATE_TIMEOUT. This works similarly to IDLE_IN_TRANSACTIION_SESSION_TIMEOUT. It fires in at most PGSTAT_STAT_MIN_INTERVAL(500)ms to clean up pending statistics update. but I'm not sure what pending updates do you mean? Aren't we updating the stats at the end of each transaction? At least that's what we've been doing before, so maybe this patch changes that? regards -- Tomas Vondra http://www.2ndQuadrant.com PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services --------------E1B83F73CCBC07C9A3D11A9C Content-Type: image/png; name="chart.png" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="chart.png" 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 --------------E1B83F73CCBC07C9A3D11A9C--