Commit a141f59e authored by Kuo-Hsin Yang's avatar Kuo-Hsin Yang Committed by Commit Bot

Add VmStatInfo field oom_kill

/proc/vmstat oom_kill is the system accumulated OOM kill count.

Bug: 1124182
Change-Id: I88812c2b7c9802da4fec72df1e0838af4a1581de
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2395476
Commit-Queue: Kuo-Hsin Yang <vovoy@chromium.org>
Reviewed-by: default avatarLei Zhang <thestig@chromium.org>
Cr-Commit-Position: refs/heads/master@{#805638}
parent d282a5ad
......@@ -446,6 +446,7 @@ struct BASE_EXPORT VmStatInfo {
unsigned long pswpin = 0;
unsigned long pswpout = 0;
unsigned long pgmajfault = 0;
unsigned long oom_kill = 0;
};
// Retrieves data from /proc/vmstat about system-wide vm operations.
......
......@@ -654,9 +654,17 @@ bool ParseProcVmstat(StringPiece vmstat_data, VmStatInfo* vmstat) {
//
// Iterate through the whole file because the position of the
// fields are dependent on the kernel version and configuration.
// Returns true if all of these 3 fields are present.
bool has_pswpin = false;
bool has_pswpout = false;
bool has_pgmajfault = false;
// The oom_kill field is optional. The vmstat oom_kill field is available on
// upstream kernel 4.13. It's backported to Chrome OS kernel 3.10.
bool has_oom_kill = false;
vmstat->oom_kill = 0;
for (const StringPiece& line : SplitStringPiece(
vmstat_data, "\n", KEEP_WHITESPACE, SPLIT_WANT_NONEMPTY)) {
std::vector<StringPiece> tokens = SplitStringPiece(
......@@ -680,12 +688,14 @@ bool ParseProcVmstat(StringPiece vmstat_data, VmStatInfo* vmstat) {
vmstat->pgmajfault = val;
DCHECK(!has_pgmajfault);
has_pgmajfault = true;
} else if (tokens[0] == "oom_kill") {
vmstat->oom_kill = val;
DCHECK(!has_oom_kill);
has_oom_kill = true;
}
if (has_pswpin && has_pswpout && has_pgmajfault)
return true;
}
return false;
return has_pswpin && has_pswpout && has_pgmajfault;
}
bool GetSystemMemoryInfo(SystemMemoryInfoKB* meminfo) {
......
......@@ -224,103 +224,111 @@ TEST_F(SystemMetricsTest, ParseMeminfo) {
TEST_F(SystemMetricsTest, ParseVmstat) {
VmStatInfo vmstat;
// part of vmstat from a 3.2 kernel with numa enabled
// Part of vmstat from a 4.19 kernel.
const char valid_input1[] =
"nr_free_pages 905104\n"
"nr_inactive_anon 142478"
"nr_active_anon 1520046\n"
"nr_inactive_file 4481001\n"
"nr_active_file 8313439\n"
"nr_unevictable 5044\n"
"nr_mlock 5044\n"
"nr_anon_pages 1633780\n"
"nr_mapped 104742\n"
"nr_file_pages 12828218\n"
"nr_dirty 245\n"
"nr_writeback 0\n"
"nr_slab_reclaimable 831609\n"
"nr_slab_unreclaimable 41164\n"
"nr_page_table_pages 31470\n"
"nr_kernel_stack 1735\n"
"nr_unstable 0\n"
"nr_bounce 0\n"
"nr_vmscan_write 406\n"
"nr_vmscan_immediate_reclaim 281\n"
"nr_writeback_temp 0\n"
"nr_isolated_anon 0\n"
"nr_isolated_file 0\n"
"nr_shmem 28820\n"
"nr_dirtied 84674644\n"
"nr_written 75307109\n"
"nr_anon_transparent_hugepages 0\n"
"nr_dirty_threshold 1536206\n"
"nr_dirty_background_threshold 768103\n"
"pgpgin 30777108\n"
"pgpgout 319023278\n"
"pswpin 179\n"
"pswpout 406\n"
"pgalloc_dma 0\n"
"pgalloc_dma32 20833399\n"
"pgalloc_normal 1622609290\n"
"pgpgin 2358216\n"
"pgpgout 296072\n"
"pswpin 345219\n"
"pswpout 2605828\n"
"pgalloc_dma32 8380235\n"
"pgalloc_normal 3384525\n"
"pgalloc_movable 0\n"
"pgfree 1644355583\n"
"pgactivate 75391882\n"
"pgdeactivate 4121019\n"
"pgfault 2542879679\n"
"pgmajfault 487192\n";
"allocstall_dma32 0\n"
"allocstall_normal 2028\n"
"allocstall_movable 32559\n"
"pgskip_dma32 0\n"
"pgskip_normal 0\n"
"pgskip_movable 0\n"
"pgfree 11802722\n"
"pgactivate 894917\n"
"pgdeactivate 3255711\n"
"pglazyfree 48\n"
"pgfault 10043657\n"
"pgmajfault 358901\n"
"pgmajfault_s 2100\n"
"pgmajfault_a 343211\n"
"pgmajfault_f 13590\n"
"pglazyfreed 0\n"
"pgrefill 3429488\n"
"pgsteal_kswapd 1466893\n"
"pgsteal_direct 1771759\n"
"pgscan_kswapd 1907332\n"
"pgscan_direct 2118930\n"
"pgscan_direct_throttle 154\n"
"pginodesteal 3176\n"
"slabs_scanned 293804\n"
"kswapd_inodesteal 16753\n"
"kswapd_low_wmark_hit_quickly 10\n"
"kswapd_high_wmark_hit_quickly 423\n"
"pageoutrun 441\n"
"pgrotated 1636\n"
"drop_pagecache 0\n"
"drop_slab 0\n"
"oom_kill 18\n";
const char valid_input2[] =
"nr_free_pages 180125\n"
"nr_inactive_anon 51\n"
"nr_active_anon 38832\n"
"nr_inactive_file 50171\n"
"nr_active_file 47510\n"
"nr_unevictable 0\n"
"nr_mlock 0\n"
"nr_anon_pages 38825\n"
"nr_mapped 24043\n"
"nr_file_pages 97733\n"
"nr_dirty 0\n"
"nr_writeback 0\n"
"nr_slab_reclaimable 4032\n"
"nr_slab_unreclaimable 2848\n"
"nr_page_table_pages 1505\n"
"nr_kernel_stack 626\n"
"nr_unstable 0\n"
"nr_bounce 0\n"
"nr_vmscan_write 0\n"
"nr_vmscan_immediate_reclaim 0\n"
"nr_writeback_temp 0\n"
"nr_isolated_anon 0\n"
"nr_isolated_file 0\n"
"nr_shmem 58\n"
"nr_dirtied 435358\n"
"nr_written 401258\n"
"nr_anon_transparent_hugepages 0\n"
"nr_dirty_threshold 18566\n"
"nr_dirty_background_threshold 4641\n"
"pgpgin 299464\n"
"pgpgout 2437788\n"
"pgpgin 2606135\n"
"pgpgout 1359128\n"
"pswpin 899959\n"
"pswpout 19761244\n"
"pgalloc_dma 31\n"
"pgalloc_dma32 18139339\n"
"pgalloc_normal 44085950\n"
"pgalloc_movable 0\n"
"allocstall_dma 0\n"
"allocstall_dma32 0\n"
"allocstall_normal 18881\n"
"allocstall_movable 169527\n"
"pgskip_dma 0\n"
"pgskip_dma32 0\n"
"pgskip_normal 0\n"
"pgskip_movable 0\n"
"pgfree 63060999\n"
"pgactivate 1703494\n"
"pgdeactivate 20537803\n"
"pglazyfree 163\n"
"pgfault 45201169\n"
"pgmajfault 609626\n"
"pgmajfault_s 7488\n"
"pgmajfault_a 591793\n"
"pgmajfault_f 10345\n"
"pglazyfreed 0\n"
"pgrefill 20673453\n"
"pgsteal_kswapd 11802772\n"
"pgsteal_direct 8618160\n"
"pgscan_kswapd 12640517\n"
"pgscan_direct 9092230\n"
"pgscan_direct_throttle 638\n"
"pginodesteal 1716\n"
"slabs_scanned 2594642\n"
"kswapd_inodesteal 67358\n"
"kswapd_low_wmark_hit_quickly 52\n"
"kswapd_high_wmark_hit_quickly 11\n"
"pageoutrun 83\n"
"pgrotated 977\n"
"drop_pagecache 1\n"
"drop_slab 1\n"
"oom_kill 1\n"
"pgmigrate_success 3202\n"
"pgmigrate_fail 795\n";
const char valid_input3[] =
"pswpin 12\n"
"pswpout 901\n"
"pgalloc_normal 144213030\n"
"pgalloc_high 164501274\n"
"pgalloc_movable 0\n"
"pgfree 308894908\n"
"pgactivate 239320\n"
"pgdeactivate 1\n"
"pgfault 716044601\n"
"pgmajfault 2023\n"
"pgrefill_normal 0\n"
"pgrefill_high 0\n"
"pgrefill_movable 0\n";
"pgmajfault 18881\n";
EXPECT_TRUE(ParseProcVmstat(valid_input1, &vmstat));
EXPECT_EQ(179LU, vmstat.pswpin);
EXPECT_EQ(406LU, vmstat.pswpout);
EXPECT_EQ(487192LU, vmstat.pgmajfault);
EXPECT_EQ(345219LU, vmstat.pswpin);
EXPECT_EQ(2605828LU, vmstat.pswpout);
EXPECT_EQ(358901LU, vmstat.pgmajfault);
EXPECT_EQ(18LU, vmstat.oom_kill);
EXPECT_TRUE(ParseProcVmstat(valid_input2, &vmstat));
EXPECT_EQ(899959LU, vmstat.pswpin);
EXPECT_EQ(19761244LU, vmstat.pswpout);
EXPECT_EQ(609626LU, vmstat.pgmajfault);
EXPECT_EQ(1LU, vmstat.oom_kill);
EXPECT_TRUE(ParseProcVmstat(valid_input3, &vmstat));
EXPECT_EQ(12LU, vmstat.pswpin);
EXPECT_EQ(901LU, vmstat.pswpout);
EXPECT_EQ(2023LU, vmstat.pgmajfault);
EXPECT_EQ(18881LU, vmstat.pgmajfault);
EXPECT_EQ(0LU, vmstat.oom_kill);
const char missing_pgmajfault_input[] =
"pswpin 12\n"
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment