Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1732469 > unrolled thread

[RFC] oom: capture unreclaimable slab info in oom message when kernel panic

Started by"Yang Shi" <yang.s@alibaba-inc.com>
First post2017-09-14 19:20 +0200
Last post2017-09-14 19:30 +0200
Articles 6 — 2 participants

Back to article view | Back to linux.kernel


Contents

  [RFC] oom: capture unreclaimable slab info in oom message when kernel panic "Yang Shi" <yang.s@alibaba-inc.com> - 2017-09-14 19:20 +0200
    [PATCH 1/3] mm: slab: output reclaimable flag in /proc/slabinfo "Yang Shi" <yang.s@alibaba-inc.com> - 2017-09-14 19:20 +0200
      Re: [PATCH 1/3] mm: slab: output reclaimable flag in  /proc/slabinfo Christopher Lameter <cl@linux.com> - 2017-09-14 19:30 +0200
        Re: [PATCH 1/3] mm: slab: output reclaimable flag in /proc/slabinfo "Yang Shi" <yang.s@alibaba-inc.com> - 2017-09-14 20:00 +0200
    [PATCH 2/3] tools: slabinfo: add "-U" option to show unreclaimable slabs only "Yang Shi" <yang.s@alibaba-inc.com> - 2017-09-14 19:20 +0200
      Re: [PATCH 2/3] tools: slabinfo: add "-U" option to show unreclaimable  slabs only Christopher Lameter <cl@linux.com> - 2017-09-14 19:30 +0200

#1732469 — [RFC] oom: capture unreclaimable slab info in oom message when kernel panic

From"Yang Shi" <yang.s@alibaba-inc.com>
Date2017-09-14 19:20 +0200
Subject[RFC] oom: capture unreclaimable slab info in oom message when kernel panic
Message-ID<upFXY-7Vl-5@gated-at.bofh.it>
Recently we ran into a oom issue, kernel panic due to no killable process.
The dmesg shows huge unreclaimable slabs used almost 100% memory, but kdump
doesn't capture vmcore due to some reason.

So, it may sound better to capture unreclaimable slab info in oom message when
kernel panic to aid trouble shooting and cover the corner case.
Since kernel already panic, so capturing more information sounds worthy and
doesn't bother normal oom killer.

With the patchset, /proc/slabinfo can print an extra column for reclaimable
flag and tools/vm/slabinfo has a new option, "-U", to show unreclaimable
slab only.

And, oom will print all non zero (num_objs * size != 0) unreclaimable slabs in
oom killer message.

For details, please see the commit log for each commit.

Yang Shi (3):
      mm: slab: output reclaimable flag in /proc/slabinfo
      tools: slabinfo: add "-U" option to show unreclaimable slabs only
      mm: oom: show unreclaimable slab info when kernel panic

 mm/oom_kill.c       | 13 +++++++++++--
 mm/slab.c           |  1 +
 mm/slab.h           |  7 +++++++
 mm/slab_common.c    | 27 +++++++++++++++++++++++++++
 mm/slub.c           |  1 +
 tools/vm/slabinfo.c | 11 ++++++++++-
 6 files changed, 57 insertions(+), 3 deletions(-)

[toc] | [next] | [standalone]


#1732470 — [PATCH 1/3] mm: slab: output reclaimable flag in /proc/slabinfo

From"Yang Shi" <yang.s@alibaba-inc.com>
Date2017-09-14 19:20 +0200
Subject[PATCH 1/3] mm: slab: output reclaimable flag in /proc/slabinfo
Message-ID<upFXY-7Vl-15@gated-at.bofh.it>
In reply to#1732469
Although slabinfo in tools can print out the flag of slabs to show which
one is reclaimable, it sounds nice to have reclaimable flag shows in
/proc/slabinfo too since /proc should be still the first place to check
those slab info.

Add a new column called "reclaim" in /proc/slabinfo, "1" means
reclaimable, "0" means unreclaimable.

Signed-off-by: Yang Shi <yang.s@alibaba-inc.com>
---
 mm/slab.c        | 1 +
 mm/slab.h        | 6 ++++++
 mm/slab_common.c | 2 ++
 mm/slub.c        | 1 +
 4 files changed, 10 insertions(+)

diff --git a/mm/slab.c b/mm/slab.c
index 04dec48..4f4971c 100644
--- a/mm/slab.c
+++ b/mm/slab.c
@@ -4132,6 +4132,7 @@ void get_slabinfo(struct kmem_cache *cachep, struct slabinfo *sinfo)
 	sinfo->shared = cachep->shared;
 	sinfo->objects_per_slab = cachep->num;
 	sinfo->cache_order = cachep->gfporder;
+	sinfo->reclaim = is_reclaimable(cachep);
 }
 
 void slabinfo_show_stats(struct seq_file *m, struct kmem_cache *cachep)
diff --git a/mm/slab.h b/mm/slab.h
index 0733628..cf01a6e 100644
--- a/mm/slab.h
+++ b/mm/slab.h
@@ -186,6 +186,7 @@ struct slabinfo {
 	unsigned int shared;
 	unsigned int objects_per_slab;
 	unsigned int cache_order;
+	unsigned int reclaim;
 };
 
 void get_slabinfo(struct kmem_cache *s, struct slabinfo *sinfo);
@@ -352,6 +353,11 @@ static inline void memcg_link_cache(struct kmem_cache *s)
 
 #endif /* CONFIG_MEMCG && !CONFIG_SLOB */
 
+static inline bool is_reclaimable(struct kmem_cache *s)
+{
+	return (s->flags & SLAB_RECLAIM_ACCOUNT) ? true : false;
+}
+
 static inline struct kmem_cache *cache_from_obj(struct kmem_cache *s, void *x)
 {
 	struct kmem_cache *cachep;
diff --git a/mm/slab_common.c b/mm/slab_common.c
index 904a83b..8a55730 100644
--- a/mm/slab_common.c
+++ b/mm/slab_common.c
@@ -1201,6 +1201,7 @@ static void print_slabinfo_header(struct seq_file *m)
 	seq_puts(m, " : globalstat <listallocs> <maxobjs> <grown> <reaped> <error> <maxfreeable> <nodeallocs> <remotefrees> <alienoverflow>");
 	seq_puts(m, " : cpustat <allochit> <allocmiss> <freehit> <freemiss>");
 #endif
+	seq_puts(m, " : reclaim");
 	seq_putc(m, '\n');
 }
 
@@ -1259,6 +1260,7 @@ static void cache_show(struct kmem_cache *s, struct seq_file *m)
 	seq_printf(m, " : slabdata %6lu %6lu %6lu",
 		   sinfo.active_slabs, sinfo.num_slabs, sinfo.shared_avail);
 	slabinfo_show_stats(m, s);
+	seq_printf(m, " : %u", sinfo.reclaim);
 	seq_putc(m, '\n');
 }
 
diff --git a/mm/slub.c b/mm/slub.c
index d39a5d3..c8526c0 100644
--- a/mm/slub.c
+++ b/mm/slub.c
@@ -5872,6 +5872,7 @@ void get_slabinfo(struct kmem_cache *s, struct slabinfo *sinfo)
 	sinfo->num_slabs = nr_slabs;
 	sinfo->objects_per_slab = oo_objects(s->oo);
 	sinfo->cache_order = oo_order(s->oo);
+	sinfo->reclaim = is_reclaimable(s);
 }
 
 void slabinfo_show_stats(struct seq_file *m, struct kmem_cache *s)
-- 
1.8.3.1

[toc] | [prev] | [next] | [standalone]


#1732478 — Re: [PATCH 1/3] mm: slab: output reclaimable flag in /proc/slabinfo

FromChristopher Lameter <cl@linux.com>
Date2017-09-14 19:30 +0200
SubjectRe: [PATCH 1/3] mm: slab: output reclaimable flag in /proc/slabinfo
Message-ID<upG7E-7Yy-15@gated-at.bofh.it>
In reply to#1732470
Well /proc/slabinfo is a legacy interface. The infomation if a slab is
reclaimable is available via the slabinfo tool. We would break a format
that is relied upon by numerous tools.

[toc] | [prev] | [next] | [standalone]


#1732489 — Re: [PATCH 1/3] mm: slab: output reclaimable flag in /proc/slabinfo

From"Yang Shi" <yang.s@alibaba-inc.com>
Date2017-09-14 20:00 +0200
SubjectRe: [PATCH 1/3] mm: slab: output reclaimable flag in /proc/slabinfo
Message-ID<upGAG-88i-9@gated-at.bofh.it>
In reply to#1732478

On 9/14/17 10:27 AM, Christopher Lameter wrote:
> Well /proc/slabinfo is a legacy interface. The infomation if a slab is
> reclaimable is available via the slabinfo tool. We would break a format
> that is relied upon by numerous tools.

Thanks for pointing this out. It would be unacceptable if it would break 
the backward compatibility.

A follow-up question is do we know what tools rely on the slabinfo format?

 From my point of view, although /proc/slabinfo is legacy, it sounds it 
is still used very often by the users.

Thanks,
Yang

> 

[toc] | [prev] | [next] | [standalone]


#1732472 — [PATCH 2/3] tools: slabinfo: add "-U" option to show unreclaimable slabs only

From"Yang Shi" <yang.s@alibaba-inc.com>
Date2017-09-14 19:20 +0200
Subject[PATCH 2/3] tools: slabinfo: add "-U" option to show unreclaimable slabs only
Message-ID<upFXY-7Vl-19@gated-at.bofh.it>
In reply to#1732469
Add "-U" option to show unreclaimable slabs only.

"-U" and "-S" together can tell us what unreclaimable slabs use the most
memory to help debug huge unreclaimable slabs issue.

Signed-off-by: Yang Shi <yang.s@alibaba-inc.com>
---
 tools/vm/slabinfo.c | 11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)

diff --git a/tools/vm/slabinfo.c b/tools/vm/slabinfo.c
index b9d34b3..9673190 100644
--- a/tools/vm/slabinfo.c
+++ b/tools/vm/slabinfo.c
@@ -83,6 +83,7 @@ struct aliasinfo {
 int sort_loss;
 int extended_totals;
 int show_bytes;
+int unreclaim_only;
 
 /* Debug options */
 int sanity;
@@ -132,6 +133,7 @@ static void usage(void)
 		"-L|--Loss              Sort by loss\n"
 		"-X|--Xtotals           Show extended summary information\n"
 		"-B|--Bytes             Show size in bytes\n"
+		"-U|--unreclaim		Show unreclaimable slabs only\n"
 		"\nValid debug options (FZPUT may be combined)\n"
 		"a / A          Switch on all debug options (=FZUP)\n"
 		"-              Switch off all debug options\n"
@@ -568,6 +570,9 @@ static void slabcache(struct slabinfo *s)
 	if (strcmp(s->name, "*") == 0)
 		return;
 
+	if (unreclaim_only && s->reclaim_account)
+		return;
+		
 	if (actual_slabs == 1) {
 		report(s);
 		return;
@@ -1346,6 +1351,7 @@ struct option opts[] = {
 	{ "Loss", no_argument, NULL, 'L'},
 	{ "Xtotals", no_argument, NULL, 'X'},
 	{ "Bytes", no_argument, NULL, 'B'},
+	{ "unreclaim", no_argument, NULL, 'U'},
 	{ NULL, 0, NULL, 0 }
 };
 
@@ -1357,7 +1363,7 @@ int main(int argc, char *argv[])
 
 	page_size = getpagesize();
 
-	while ((c = getopt_long(argc, argv, "aAd::Defhil1noprstvzTSN:LXB",
+	while ((c = getopt_long(argc, argv, "aAd::Defhil1noprstvzTSN:LXBU",
 						opts, NULL)) != -1)
 		switch (c) {
 		case '1':
@@ -1438,6 +1444,9 @@ int main(int argc, char *argv[])
 		case 'B':
 			show_bytes = 1;
 			break;
+		case 'U':
+			unreclaim_only = 1;
+			break;
 		default:
 			fatal("%s: Invalid option '%c'\n", argv[0], optopt);
 
-- 
1.8.3.1

[toc] | [prev] | [next] | [standalone]


#1732474 — Re: [PATCH 2/3] tools: slabinfo: add "-U" option to show unreclaimable slabs only

FromChristopher Lameter <cl@linux.com>
Date2017-09-14 19:30 +0200
SubjectRe: [PATCH 2/3] tools: slabinfo: add "-U" option to show unreclaimable slabs only
Message-ID<upG7E-7Yy-1@gated-at.bofh.it>
In reply to#1732472
Acked-by: Christoph Lameter <cl@linux.com>

[toc] | [prev] | [standalone]


Back to top | Article view | linux.kernel


csiph-web