From: Brian Foster <bfoster@redhat.com>
To: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org
Cc: ikent@redhat.com, onestero@redhat.com, willy@infradead.org
Subject: [PATCH v2 4/4] procfs: use efficient tgid pid search on root readdir
Date: Mon, 11 Jul 2022 09:52:37 -0400 [thread overview]
Message-ID: <20220711135237.173667-5-bfoster@redhat.com> (raw)
In-Reply-To: <20220711135237.173667-1-bfoster@redhat.com>
find_ge_pid() walks every allocated id and checks every associated
pid in the namespace for a link to a PIDTYPE_TGID task. If the pid
namespace contains processes with large numbers of threads, this
search doesn't scale and can notably increase getdents() syscall
latency.
For example, on a mostly idle 2.4GHz Intel Xeon running Fedora on
5.19.0-rc2, 'strace -T xfs_io -c readdir /proc' shows the following:
getdents64(... /* 814 entries */, 32768) = 20624 <0.000568>
With the addition of a dummy (i.e. idle) process running that
creates an additional 100k threads, that latency increases to:
getdents64(... /* 815 entries */, 32768) = 20656 <0.011315>
While this may not be noticeable to users in one off /proc scans or
simple usage of ps or top, we have users that report problems caused
by this latency increase in these sort of scaled environments with
custom tooling that makes heavier use of task monitoring.
Optimize the tgid task scanning in proc_pid_readdir() by using the
more efficient find_get_tgid_task() helper. This significantly
improves readdir() latency when the pid namespace is populated with
processes with very large thread counts. For example, the above 100k
idle task test against a patched kernel now results in the
following:
Idle:
getdents64(... /* 861 entries */, 32768) = 21048 <0.000670>
"" + 100k threads:
getdents64(... /* 862 entries */, 32768) = 21096 <0.000959>
... which is a much smaller latency hit after the high thread count
task is started.
Signed-off-by: Brian Foster <bfoster@redhat.com>
---
fs/proc/base.c | 17 +----------------
1 file changed, 1 insertion(+), 16 deletions(-)
diff --git a/fs/proc/base.c b/fs/proc/base.c
index 8dfa36a99c74..b3bff6d26dcc 100644
--- a/fs/proc/base.c
+++ b/fs/proc/base.c
@@ -3429,24 +3429,9 @@ struct tgid_iter {
};
static struct tgid_iter next_tgid(struct pid_namespace *ns, struct tgid_iter iter)
{
- struct pid *pid;
-
if (iter.task)
put_task_struct(iter.task);
- rcu_read_lock();
-retry:
- iter.task = NULL;
- pid = find_ge_pid(iter.tgid, ns);
- if (pid) {
- iter.tgid = pid_nr_ns(pid, ns);
- iter.task = pid_task(pid, PIDTYPE_TGID);
- if (!iter.task) {
- iter.tgid += 1;
- goto retry;
- }
- get_task_struct(iter.task);
- }
- rcu_read_unlock();
+ iter.task = find_get_tgid_task(&iter.tgid, ns);
return iter;
}
--
2.35.3
next prev parent reply other threads:[~2022-07-11 13:52 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-07-11 13:52 [PATCH v2 0/4] proc: improve root readdir latency with many threads Brian Foster
2022-07-11 13:52 ` [PATCH v2 1/4] radix-tree: propagate all tags in idr tree Brian Foster
2022-07-11 13:52 ` [PATCH v2 2/4] idr: support optional id tagging Brian Foster
2022-07-11 13:52 ` [PATCH v2 3/4] pid: tag pids associated with group leader tasks Brian Foster
2022-07-11 13:52 ` Brian Foster [this message]
2022-07-11 20:19 ` [PATCH v2 0/4] proc: improve root readdir latency with many threads Matthew Wilcox
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20220711135237.173667-5-bfoster@redhat.com \
--to=bfoster@redhat.com \
--cc=ikent@redhat.com \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=onestero@redhat.com \
--cc=willy@infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).