From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751556AbdCAJZ2 (ORCPT ); Wed, 1 Mar 2017 04:25:28 -0500 Received: from mx2.suse.de ([195.135.220.15]:54660 "EHLO mx2.suse.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751027AbdCAJZW (ORCPT ); Wed, 1 Mar 2017 04:25:22 -0500 Subject: Re: [PATCH 3/3] mm, vmscan: Prevent kswapd sleeping prematurely due to mismatched classzone_idx To: Mel Gorman References: <20170215092247.15989-1-mgorman@techsingularity.net> <20170215092247.15989-4-mgorman@techsingularity.net> <20170223150108.sjw3mghjh3jvrbjn@techsingularity.net> Cc: Andrew Morton , Shantanu Goel , Chris Mason , Johannes Weiner , LKML , Linux-MM From: Vlastimil Babka Message-ID: Date: Wed, 1 Mar 2017 10:04:52 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.7.1 MIME-Version: 1.0 In-Reply-To: <20170223150108.sjw3mghjh3jvrbjn@techsingularity.net> Content-Type: text/plain; charset=iso-8859-15 Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 02/23/2017 04:01 PM, Mel Gorman wrote: > On Mon, Feb 20, 2017 at 05:42:49PM +0100, Vlastimil Babka wrote: >>> With this patch on top, all the latencies relative to the baseline are >>> improved, particularly write latencies. The read latencies are still high >>> for the number of threads but it's worth noting that this is mostly due >>> to the IO scheduler and not directly related to reclaim. The vmstats are >>> a bit of a mix but the relevant ones are as follows; >>> >>> 4.10.0-rc7 4.10.0-rc7 4.10.0-rc7 >>> mmots-20170209 clear-v1r25keepawake-v1r25 >>> Swap Ins 0 0 0 >>> Swap Outs 0 608 0 >>> Direct pages scanned 6910672 3132699 6357298 >>> Kswapd pages scanned 57036946 82488665 56986286 >>> Kswapd pages reclaimed 55993488 63474329 55939113 >>> Direct pages reclaimed 6905990 2964843 6352115 >> >> These stats are confusing me. The earlier description suggests that this patch >> should cause less direct reclaim and more kswapd reclaim, but compared to >> "clear-v1r25" it does the opposite? Was clear-v1r25 overreclaiming then? (when >> considering direct + kswapd combined) >> > > The description is referring to the impact relative to baseline. It is > true that relative to patch that direct reclaim is higher but there are > a number of anomalies. > > Note that kswapd is scanning very aggressively in "clear-v1" and overall > efficiency is down to 76%. It's also not clear in the stats but in > "clear-v1", pgskip_* is active as the wrong zone is being reclaimed for > due to the patch "mm, vmscan: fix zone balance check in > prepare_kswapd_sleep". It's also doing a lot of writing of file-backed > pages from reclaim context and some swapping due to the aggressiveness > of the scan. > > While direct reclaim activity might be lower, it's due to kswapd scanning > aggressively and trying to reclaim the world which is not the right thing > to do. With the patches applied, there is still direct reclaim but the fast > bulk of them are when the workload changes phase from "creating work files" > to starting multiple threads that allocate a lot of anonymous memory with > a sudden spike in memory pressure that kswapd does not keep ahead of with > multiple allocating threads. Thanks for the explanation. > >>> @@ -3328,6 +3330,22 @@ static int balance_pgdat(pg_data_t *pgdat, int order, int classzone_idx) >>> return sc.order; >>> } >>> >>> +/* >>> + * pgdat->kswapd_classzone_idx is the highest zone index that a recent >>> + * allocation request woke kswapd for. When kswapd has not woken recently, >>> + * the value is MAX_NR_ZONES which is not a valid index. This compares a >>> + * given classzone and returns it or the highest classzone index kswapd >>> + * was recently woke for. >>> + */ >>> +static enum zone_type kswapd_classzone_idx(pg_data_t *pgdat, >>> + enum zone_type classzone_idx) >>> +{ >>> + if (pgdat->kswapd_classzone_idx == MAX_NR_ZONES) >>> + return classzone_idx; >>> + >>> + return max(pgdat->kswapd_classzone_idx, classzone_idx); >> >> A bit paranoid comment: this should probably read pgdat->kswapd_classzone_idx to >> a local variable with READ_ONCE(), otherwise something can set it to >> MAX_NR_ZONES between the check and max(), and compiler can decide to reread. >> Probably not an issue with current callers, but I'd rather future-proof it. >> > > I'm a little wary of adding READ_ONCE unless there is a definite > problem. Even if it was an issue, I think it would be better to protect > thse kswapd_classzone_idx and kswapd_order with a spinlock that is taken > if an update is required or a read to fully guarantee the ordering. > > The consequences as they are is that kswapd may miss reclaiming at a > higher order or classzone than it should have although it is very > unlikely and the update and read are made with a workqueue wake and > scheduler wakeup which should be sufficient in terms of barriers. OK then. Acked-by: Vlastimil Babka