From patchwork Wed Aug 1 15:13:02 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Johannes Weiner X-Patchwork-Id: 10552427 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 606B613B8 for ; Wed, 1 Aug 2018 15:10:42 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 513CB2B864 for ; Wed, 1 Aug 2018 15:10:42 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 4E7F52B887; Wed, 1 Aug 2018 15:10:42 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.8 required=2.0 tests=BAYES_00,DKIM_SIGNED, MAILING_LIST_MULTI,RCVD_IN_DNSWL_NONE,T_DKIM_INVALID autolearn=ham version=3.3.1 Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 7F5A92B875 for ; Wed, 1 Aug 2018 15:10:41 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id E8F9F6B0008; Wed, 1 Aug 2018 11:10:37 -0400 (EDT) Delivered-To: linux-mm-outgoing@kvack.org Received: by kanga.kvack.org (Postfix, from userid 40) id E45866B000C; Wed, 1 Aug 2018 11:10:37 -0400 (EDT) X-Original-To: int-list-linux-mm@kvack.org X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id BBF466B0008; Wed, 1 Aug 2018 11:10:37 -0400 (EDT) X-Original-To: linux-mm@kvack.org X-Delivered-To: linux-mm@kvack.org Received: from mail-qk0-f199.google.com (mail-qk0-f199.google.com [209.85.220.199]) by kanga.kvack.org (Postfix) with ESMTP id 8E96E6B0008 for ; Wed, 1 Aug 2018 11:10:37 -0400 (EDT) Received: by mail-qk0-f199.google.com with SMTP id z18-v6so16900041qki.22 for ; Wed, 01 Aug 2018 08:10:37 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:dkim-signature:from:to:cc:subject:date :message-id:in-reply-to:references:reply-to; bh=yu9UdCtaoT51hJzI6OxnWMzNlhzbw5nOYEshpoGdmog=; b=CPBWZa/WNsXwc+PRz06pRdYu0R5ZSt9+F5ID2zO5loTf01CrKzJwX/mi7InRkPAUEk EiTb96dCHwQ6pZ9+patUB55FWGYyLq5LdfCYZwRkpKANKqIZ38zc3fes2pyrQuFftaa6 PeNnMQvRPVaqPu0HNBiEw0ImvYtq6M2ABk8gBHKfA5+9ZGs1//K4fjYusghrF8eb+cpx xILWiW+du7bGwn1EcM6H+U2DZyKFiXofz48Qu06cZ1Dr4DuMU/0TQtrheATUvLq+tkti aJLqs3U/tUT87BGS/Zgn+vOtGRB9bpBNjoPUcDv4MSKKTZo4JTc0b1wis5YGjYCNzuVY pNzQ== X-Gm-Message-State: AOUpUlHrSpzv5WDwRjeQGJNks2Rx9wpmss7Adi3VJJKQ9gjG6ZqeEqbQ QXONpZhD9tldr8AYqJYqYqVO05TA1UfPJzm/NrDjzjdcXnN+nh3ApyKo/URF5WCHbgNfayvaesu W06nDbvUBk3y55LkOAgzQiAq208aO4rh42If87+Z/xbUWVcYeD0f5z7gMHJx8FPHKEm/RHsujYg LmjgQRyNOysUWWyTb8u7wMkYWdfkji6nNU23dUadNi1TGOEIkUnRPEcBWqnU+uyMVP9mHyVuaZj NNQjm6tF9mY/lEvTIpDInh1MsRMM+MTHUqcVfsEFje64Ni3QrXkwdLoJRfje0Z/TJ7OpKGDDUfi GjjO5QUOEkYz6qP25N9xiVqd5gUcySUAJgCtZlRkyuQ7T5zPJUWv7AujCTIhW3XjEM9WmYmEeyX r X-Received: by 2002:a37:7a46:: with SMTP id v67-v6mr13365256qkc.188.1533136237333; Wed, 01 Aug 2018 08:10:37 -0700 (PDT) X-Received: by 2002:a37:7a46:: with SMTP id v67-v6mr13365020qkc.188.1533136233814; Wed, 01 Aug 2018 08:10:33 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1533136233; cv=none; d=google.com; s=arc-20160816; b=lgULCwnIqNqCszZ2QQT75SCh5/1AxgazNWy7icwHZPCDcBN+UR+fOr4HCAZfUqnXvZ HxpVa68fOFPtcpggY39u5+hc+iG2FSy59OrjVXaOAMH+r7wu8rGoxqLH3AN/pIFlgYCW E4oi3UJs21aATXfj8rvUANeKx+AXhdnkoTUlooKi2B8WT8mmRRE7OnOZFhtOxH+iZHCk VnjlxazAg1/eoczx8Q/dNgbUKLRvSmjD9haODGwOnz08wyPNZH97Oolc6PuyO+t0F52G fNTwTGpA5Yhlc65bJDJLrB4OO/LiM3VvexVy6sfspDEtnNMl5R9emmMO0d2IgxFSiUs8 FADA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=reply-to:references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature:arc-authentication-results; bh=yu9UdCtaoT51hJzI6OxnWMzNlhzbw5nOYEshpoGdmog=; b=F28N9sUOqGDgyrbTt9NxcunDdW7rDAbfeKHQtPnV2Im6vCENj3CtjEWEIW79AR48RV 0ekS8xVZ3w/6wpbp2TBYriPlZNJntw5JGpJkiRFuU6+cptU+p5rmY18FSWzv0ErHK5wS V2S05vTFuwWwspp00yA+757f/M3EfPtxFKHxXMRqvbUrfe6S0R1h4BOwd+D9tPbemIDV aNlidfRqgtMWAyvl5ytHk06uIVcJHjxtrlv6jxC+nQXDuw4Pk31MeQnrW6Qj4FZYrMJ1 s8+C3QfTjJUMrS8AG3s4WZTIP6lOa3skAflOWuNhtHSSwB6lPbIcik0tU6gTPzESkHkK Ad8Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@cmpxchg-org.20150623.gappssmtp.com header.s=20150623 header.b="S+bQ/odG"; spf=pass (google.com: domain of hannes@cmpxchg.org designates 209.85.220.65 as permitted sender) smtp.mailfrom=hannes@cmpxchg.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=cmpxchg.org Received: from mail-sor-f65.google.com (mail-sor-f65.google.com. [209.85.220.65]) by mx.google.com with SMTPS id o16-v6sor7883727qve.37.2018.08.01.08.10.33 for (Google Transport Security); Wed, 01 Aug 2018 08:10:33 -0700 (PDT) Received-SPF: pass (google.com: domain of hannes@cmpxchg.org designates 209.85.220.65 as permitted sender) client-ip=209.85.220.65; Authentication-Results: mx.google.com; dkim=pass header.i=@cmpxchg-org.20150623.gappssmtp.com header.s=20150623 header.b="S+bQ/odG"; spf=pass (google.com: domain of hannes@cmpxchg.org designates 209.85.220.65 as permitted sender) smtp.mailfrom=hannes@cmpxchg.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=cmpxchg.org DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cmpxchg-org.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references:reply-to; bh=yu9UdCtaoT51hJzI6OxnWMzNlhzbw5nOYEshpoGdmog=; b=S+bQ/odGJrCZYEzrG/5rcd+JaoO/SKO1JlwfeOLVDeYc3ScY4qNj+NE+5KRJkBSBJv eT2X9qu0XZjoVUF1scysQNi7fYNaxJQvHrP1c36DhenmcrY5ysMY8PlS8ppQILusFWsg BhUvXTbNpUuOGVpNALd+jtlWRYRtBt4IS49ZOgKh2/kN4/GMn8SvMxNrYBeCHeWOIUfa mZ8xivlOAvgcmdsMVfd/lqI6Ne9RSEbgitbccX5/bVttDOiHHM3jDv4Bv4cr/H/c1XQg ya875xTT7IFS4hS0+PLkpxfk2UezJJZrkXMzECkUJj184prcCdjZ5kPE5Wk6LVKmJXyg iviA== X-Google-Smtp-Source: AAOMgpf+d8efcRMdqvpwDhWjBvgfmJWM53WA2bl1mVriXs594AIM0XSmTu4BEa108hSTQ2/KazewIQ== X-Received: by 2002:a0c:aed9:: with SMTP id n25-v6mr23981811qvd.10.1533136233224; Wed, 01 Aug 2018 08:10:33 -0700 (PDT) Received: from localhost (216.49.36.201.res-cmts.bus.ptd.net. [216.49.36.201]) by smtp.gmail.com with ESMTPSA id v41-v6sm14147110qtk.70.2018.08.01.08.10.31 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Wed, 01 Aug 2018 08:10:32 -0700 (PDT) From: Johannes Weiner To: Ingo Molnar , Peter Zijlstra , Andrew Morton , Linus Torvalds Cc: Tejun Heo , Suren Baghdasaryan , Daniel Drake , Vinayak Menon , Christopher Lameter , Mike Galbraith , Shakeel Butt , Peter Enderborg , linux-mm@kvack.org, cgroups@vger.kernel.org, linux-kernel@vger.kernel.org, kernel-team@fb.com Subject: [PATCH 3/9] delayacct: track delays from thrashing cache pages Date: Wed, 1 Aug 2018 11:13:02 -0400 Message-Id: <20180801151308.32234-4-hannes@cmpxchg.org> X-Mailer: git-send-email 2.18.0 In-Reply-To: <20180801151308.32234-1-hannes@cmpxchg.org> References: <20180801151308.32234-1-hannes@cmpxchg.org> Reply-To: "[PATCH 0/9]"@kvack.org, "psi:pressure"@kvack.org, stall@kvack.org, information@kvack.org, for@kvack.org, CPU@kvack.org, memory@kvack.org, and@kvack.org, IO@kvack.org, v3@kvack.org X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: X-Virus-Scanned: ClamAV using ClamSMTP Delay accounting already measures the time a task spends in direct reclaim and waiting for swapin, but in low memory situations tasks spend can spend a significant amount of their time waiting on thrashing page cache. This isn't tracked right now. To know the full impact of memory contention on an individual task, measure the delay when waiting for a recently evicted active cache page to read back into memory. Also update tools/accounting/getdelays.c: [hannes@computer accounting]$ sudo ./getdelays -d -p 1 print delayacct stats ON PID 1 CPU count real total virtual total delay total delay average 50318 745000000 847346785 400533713 0.008ms IO count delay total delay average 435 122601218 0ms SWAP count delay total delay average 0 0 0ms RECLAIM count delay total delay average 0 0 0ms THRASHING count delay total delay average 19 12621439 0ms Signed-off-by: Johannes Weiner --- include/linux/delayacct.h | 23 +++++++++++++++++++++++ include/uapi/linux/taskstats.h | 6 +++++- kernel/delayacct.c | 15 +++++++++++++++ mm/filemap.c | 11 +++++++++++ tools/accounting/getdelays.c | 8 +++++++- 5 files changed, 61 insertions(+), 2 deletions(-) diff --git a/include/linux/delayacct.h b/include/linux/delayacct.h index 5e335b6203f4..d3e75b3ba487 100644 --- a/include/linux/delayacct.h +++ b/include/linux/delayacct.h @@ -57,7 +57,12 @@ struct task_delay_info { u64 freepages_start; u64 freepages_delay; /* wait for memory reclaim */ + + u64 thrashing_start; + u64 thrashing_delay; /* wait for thrashing page */ + u32 freepages_count; /* total count of memory reclaim */ + u32 thrashing_count; /* total count of thrash waits */ }; #endif @@ -76,6 +81,8 @@ extern int __delayacct_add_tsk(struct taskstats *, struct task_struct *); extern __u64 __delayacct_blkio_ticks(struct task_struct *); extern void __delayacct_freepages_start(void); extern void __delayacct_freepages_end(void); +extern void __delayacct_thrashing_start(void); +extern void __delayacct_thrashing_end(void); static inline int delayacct_is_task_waiting_on_io(struct task_struct *p) { @@ -156,6 +163,18 @@ static inline void delayacct_freepages_end(void) __delayacct_freepages_end(); } +static inline void delayacct_thrashing_start(void) +{ + if (current->delays) + __delayacct_thrashing_start(); +} + +static inline void delayacct_thrashing_end(void) +{ + if (current->delays) + __delayacct_thrashing_end(); +} + #else static inline void delayacct_set_flag(int flag) {} @@ -182,6 +201,10 @@ static inline void delayacct_freepages_start(void) {} static inline void delayacct_freepages_end(void) {} +static inline void delayacct_thrashing_start(void) +{} +static inline void delayacct_thrashing_end(void) +{} #endif /* CONFIG_TASK_DELAY_ACCT */ diff --git a/include/uapi/linux/taskstats.h b/include/uapi/linux/taskstats.h index b7aa7bb2349f..5e8ca16a9079 100644 --- a/include/uapi/linux/taskstats.h +++ b/include/uapi/linux/taskstats.h @@ -34,7 +34,7 @@ */ -#define TASKSTATS_VERSION 8 +#define TASKSTATS_VERSION 9 #define TS_COMM_LEN 32 /* should be >= TASK_COMM_LEN * in linux/sched.h */ @@ -164,6 +164,10 @@ struct taskstats { /* Delay waiting for memory reclaim */ __u64 freepages_count; __u64 freepages_delay_total; + + /* Delay waiting for thrashing page */ + __u64 thrashing_count; + __u64 thrashing_delay_total; }; diff --git a/kernel/delayacct.c b/kernel/delayacct.c index e2764d767f18..02ba745c448d 100644 --- a/kernel/delayacct.c +++ b/kernel/delayacct.c @@ -134,9 +134,12 @@ int __delayacct_add_tsk(struct taskstats *d, struct task_struct *tsk) d->swapin_delay_total = (tmp < d->swapin_delay_total) ? 0 : tmp; tmp = d->freepages_delay_total + tsk->delays->freepages_delay; d->freepages_delay_total = (tmp < d->freepages_delay_total) ? 0 : tmp; + tmp = d->thrashing_delay_total + tsk->delays->thrashing_delay; + d->thrashing_delay_total = (tmp < d->thrashing_delay_total) ? 0 : tmp; d->blkio_count += tsk->delays->blkio_count; d->swapin_count += tsk->delays->swapin_count; d->freepages_count += tsk->delays->freepages_count; + d->thrashing_count += tsk->delays->thrashing_count; spin_unlock_irqrestore(&tsk->delays->lock, flags); return 0; @@ -168,3 +171,15 @@ void __delayacct_freepages_end(void) ¤t->delays->freepages_count); } +void __delayacct_thrashing_start(void) +{ + current->delays->thrashing_start = ktime_get_ns(); +} + +void __delayacct_thrashing_end(void) +{ + delayacct_end(¤t->delays->lock, + ¤t->delays->thrashing_start, + ¤t->delays->thrashing_delay, + ¤t->delays->thrashing_count); +} diff --git a/mm/filemap.c b/mm/filemap.c index bd36b7226cf4..e49961e13dd9 100644 --- a/mm/filemap.c +++ b/mm/filemap.c @@ -36,6 +36,7 @@ #include #include #include +#include #include "internal.h" #define CREATE_TRACE_POINTS @@ -1073,8 +1074,15 @@ static inline int wait_on_page_bit_common(wait_queue_head_t *q, { struct wait_page_queue wait_page; wait_queue_entry_t *wait = &wait_page.wait; + bool thrashing = false; int ret = 0; + if (bit_nr == PG_locked && !PageSwapBacked(page) && + !PageUptodate(page) && PageWorkingset(page)) { + delayacct_thrashing_start(); + thrashing = true; + } + init_wait(wait); wait->flags = lock ? WQ_FLAG_EXCLUSIVE : 0; wait->func = wake_page_function; @@ -1113,6 +1121,9 @@ static inline int wait_on_page_bit_common(wait_queue_head_t *q, finish_wait(q, wait); + if (thrashing) + delayacct_thrashing_end(); + /* * A signal could leave PageWaiters set. Clearing it here if * !waitqueue_active would be possible (by open-coding finish_wait), diff --git a/tools/accounting/getdelays.c b/tools/accounting/getdelays.c index 9f420d98b5fb..8cb504d30384 100644 --- a/tools/accounting/getdelays.c +++ b/tools/accounting/getdelays.c @@ -203,6 +203,8 @@ static void print_delayacct(struct taskstats *t) "SWAP %15s%15s%15s\n" " %15llu%15llu%15llums\n" "RECLAIM %12s%15s%15s\n" + " %15llu%15llu%15llums\n" + "THRASHING%12s%15s%15s\n" " %15llu%15llu%15llums\n", "count", "real total", "virtual total", "delay total", "delay average", @@ -222,7 +224,11 @@ static void print_delayacct(struct taskstats *t) "count", "delay total", "delay average", (unsigned long long)t->freepages_count, (unsigned long long)t->freepages_delay_total, - average_ms(t->freepages_delay_total, t->freepages_count)); + average_ms(t->freepages_delay_total, t->freepages_count), + "count", "delay total", "delay average", + (unsigned long long)t->thrashing_count, + (unsigned long long)t->thrashing_delay_total, + average_ms(t->thrashing_delay_total, t->thrashing_count)); } static void task_context_switch_counts(struct taskstats *t)