thp, vmstats: count deferred split events
Count how many times we put a THP in split queue. Currently, it happens on partial unmap of a THP. Rapidly growing value can indicate that an application behaves unfriendly wrt THP: often fault in huge page and then unmap part of it. This leads to unnecessary memory fragmentation and the application may require tuning. The event also can help with debugging kernel [mis-]behaviour. Signed-off-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com> Cc: Andrea Arcangeli <aarcange@redhat.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
0a6b76dd23
commit
f9719a03de
|
@ -229,6 +229,11 @@ thp_split_page is incremented every time a huge page is split into base
|
|||
thp_split_page_failed is is incremented if kernel fails to split huge
|
||||
page. This can happen if the page was pinned by somebody.
|
||||
|
||||
thp_deferred_split_page is incremented when a huge page is put onto split
|
||||
queue. This happens when a huge page is partially unmapped and
|
||||
splitting it would free up some memory. Pages on split queue are
|
||||
going to be split under memory pressure.
|
||||
|
||||
thp_split_pmd is incremented every time a PMD split into table of PTEs.
|
||||
This can happen, for instance, when application calls mprotect() or
|
||||
munmap() on part of huge page. It doesn't split huge page, only
|
||||
|
|
|
@ -72,6 +72,7 @@ enum vm_event_item { PGPGIN, PGPGOUT, PSWPIN, PSWPOUT,
|
|||
THP_COLLAPSE_ALLOC_FAILED,
|
||||
THP_SPLIT_PAGE,
|
||||
THP_SPLIT_PAGE_FAILED,
|
||||
THP_DEFERRED_SPLIT_PAGE,
|
||||
THP_SPLIT_PMD,
|
||||
THP_ZERO_PAGE_ALLOC,
|
||||
THP_ZERO_PAGE_ALLOC_FAILED,
|
||||
|
|
|
@ -3455,6 +3455,7 @@ void deferred_split_huge_page(struct page *page)
|
|||
|
||||
spin_lock_irqsave(&pgdata->split_queue_lock, flags);
|
||||
if (list_empty(page_deferred_list(page))) {
|
||||
count_vm_event(THP_DEFERRED_SPLIT_PAGE);
|
||||
list_add_tail(page_deferred_list(page), &pgdata->split_queue);
|
||||
pgdata->split_queue_len++;
|
||||
}
|
||||
|
|
|
@ -848,6 +848,7 @@ const char * const vmstat_text[] = {
|
|||
"thp_collapse_alloc_failed",
|
||||
"thp_split_page",
|
||||
"thp_split_page_failed",
|
||||
"thp_deferred_split_page",
|
||||
"thp_split_pmd",
|
||||
"thp_zero_page_alloc",
|
||||
"thp_zero_page_alloc_failed",
|
||||
|
|
Loading…
Reference in New Issue