2017-11-25 12:52:55 +01:00
<!DOCTYPE html>
< html lang = "en" >
< head >
< script src = "__javascript__/OOMAnalyser.js" defer = "defer" > < / script >
< meta charset = "UTF-8" >
< title > OOM Analyser< / title >
2018-11-08 18:09:00 +01:00
< style >
2019-11-24 10:46:44 +01:00
/* Use BEM (Block__Element--Modifier) naming convention */
2017-11-25 12:52:55 +01:00
2018-10-13 19:00:09 +02:00
.text--align-right {
2018-04-16 21:40:52 +02:00
text-align: right;
}
2018-10-13 19:12:13 +02:00
.text__superscript {
vertical-align: super;
font-size: 0.83em;
}
2019-11-24 10:23:57 +01:00
.js-text--default-hide {
2019-11-13 20:48:44 +01:00
/* empty just used to hide elements in the default view */
}
2019-11-24 10:23:57 +01:00
.js-text--default-show {
2019-11-13 20:48:44 +01:00
/* empty just used to show elements in the default view */
}
2019-12-20 18:21:59 +01:00
.table__sub-section--bold {
font-weight: bold;
2020-04-08 17:37:41 +02:00
font-size: medium;
2020-01-09 20:24:33 +01:00
padding: 5px;
2019-12-20 18:21:59 +01:00
}
2019-11-16 10:53:07 +01:00
a {
text-decoration: none;
}
a:hover, a:active {
text-decoration: underline;
}
.a--small {
font-size: small;
font-weight: unset;
padding: unset;
}
.a__footnote {
vertical-align: super;
font-size: 0.83em;
}
2019-11-21 07:50:01 +01:00
.h2--no-newline {
/* Prevent a linebreak after headline to a place a link on the same line */
/* Place such headlines within a div container if the next element can be invisible */
display: inline-block;
}
2020-04-07 17:26:29 +02:00
.mem-usage__svg {
2018-10-13 19:00:09 +02:00
display: block;
max-height: 200px;
2018-08-12 13:34:24 +02:00
}
2017-11-25 12:52:55 +01:00
table {
border-collapse: collapse;
padding: 10px;
table-layout: fixed;
text-align: left;
width: 100%;
}
2020-04-05 14:28:37 +02:00
.pstable__table--noborder {
2020-03-26 13:46:20 +01:00
border: none;
text-align: right;
background-color: unset;
2020-04-05 14:28:37 +02:00
table-layout: fixed;
2020-03-26 13:46:20 +01:00
}
2020-04-05 14:28:37 +02:00
.pstable__table--noborder thead * {
2020-03-26 13:46:20 +01:00
font-weight: bold;
2020-04-05 14:28:37 +02:00
padding-right: unset;
padding-left: unset;
white-space: nowrap;
/* overwrite the generic th/td settings */
border: none;
}
.pstable__table--noborder tbody * {
padding-left: 5px;
padding-right: 18px;
/* overwrite the generic th/td settings */
border: none;
2020-03-26 13:46:20 +01:00
}
/* Align last both columns to left in the process table */
.pstable__table--noborder td:nth-of-type(9) {
text-align: left;
}
.pstable__table--noborder td:nth-of-type(10) {
text-align: left;
}
.js-pstable__killedproc--bgcolor {
background-color: #FFD2D2;
}
.js-pstable__triggerproc--bgcolor {
background-color: #FEEFB3;
}
.pstable__row-pid--width {
2020-04-05 14:28:37 +02:00
width: 8ch;
2020-03-26 13:46:20 +01:00
}
.pstable__row-numeric--width {
2020-04-05 14:28:37 +02:00
width: 10ch;
2020-03-26 13:46:20 +01:00
}
.pstable__row-pages--width {
2020-04-05 14:28:37 +02:00
width: 16ch;
2020-03-26 13:46:20 +01:00
}
.pstable__row-oom-score-adj--width {
width: 16ch;
}
2020-04-05 14:28:37 +02:00
.pstable__row-sort--width {
padding-left: unset;
padding-right: unset;
width: 10px;
display: inline-block;
}
2020-03-26 13:46:20 +01:00
2017-11-25 12:52:55 +01:00
th {
font-weight: bold;
font-size: large;
padding: 5px;
}
th, td {
border: 1px solid black;
word-wrap: break-word;
}
2018-10-13 19:00:09 +02:00
.js-notify_box__msg--warning {
2019-11-13 20:48:44 +01:00
color: #9F6000;
background-color: #FEEFB3;
}
.js-notify_box__msg--error {
color: #D8000C;
background-color: #FFD2D2;
}
.js-text--display-none {
display: none;
}
2017-12-12 19:24:31 +01:00
2018-10-13 19:00:09 +02:00
.license__text {
font-size: small;
2017-11-25 12:52:55 +01:00
}
2018-10-13 19:00:09 +02:00
.notify_box {
width: 100%;
2017-11-25 12:52:55 +01:00
}
2018-10-13 19:00:09 +02:00
.terminal {
font-family: monospace;
overflow: auto;
}
2019-11-16 10:53:07 +01:00
.table-of-contents {
float: right;
width: 40%;
background: #eee;
font-size: 0.8em;
padding: 1em 2em;
margin: 0 0 0.5em 0.5em;
}
.table-of-contents ul {
padding: 0;
}
.table-of-contents li {
margin: 0 0 0.25em 0;
}
2017-11-25 12:52:55 +01:00
< / style >
< script >
function goBack() {
window.history.back();
}
< / script >
< / head >
< body >
< h1 > Analyse and visualise Linux OOM output< / h1 >
2020-04-08 17:37:41 +02:00
< nav class = "table-of-contents" id = "table_of_contents" >
2019-11-21 08:14:12 +01:00
< h2 > On this page< / h2 >
2019-11-16 10:53:07 +01:00
< ul >
< / ul >
< / nav >
2017-11-25 12:52:55 +01:00
< p >
2019-12-05 06:44:20 +01:00
OOMAnalyser is a small project to transform the OOM message of a Linux kernel into a more user-friendly format.
2017-11-25 12:52:55 +01:00
< / p >
< p >
2019-12-05 06:44:20 +01:00
OOMAnalyser consists of a web page into whose input field the OOM message is copied. JavaScript code extracts
the data from it and displays the details. All processing takes place in the browser. No data is transferred
to external servers. This makes it possible to use a locally stored copy of the website for analysis.
This project is written in < a href = "https://www.python.org" > Python< / a > and uses
< a href = "https://www.transcrypt.org/" > Transcrypt< / a > to translate Python code into JavaScript.
2017-12-04 19:44:48 +01:00
< / p >
2018-11-08 18:24:45 +01:00
< p >
2019-11-24 10:23:57 +01:00
< div class = "terminal notify_box js-text--default-hide js-text--display-none" id = "notify_box" > < / div >
2018-11-08 18:24:45 +01:00
2019-11-24 10:23:57 +01:00
< div class = "js-text--default-show" id = "input" >
2019-11-16 10:53:07 +01:00
< h2 id = "step1" > Step 1 - Enter your OOM message< / h2 >
2020-04-08 17:37:41 +02:00
< textarea autocomplete = "off" cols = "100" id = "textarea_oom" onfocus = "OOMAnalyser.OOMDisplayInstance.empty_textarea_oom()" rows = "20" title = "OOM input field" > Add your OOMhere< / textarea >
2017-11-25 12:52:55 +01:00
< br / >
2018-09-11 19:49:39 +02:00
< button onclick = "OOMAnalyser.OOMDisplayInstance.analyse_and_show()" title = "Analyse the OOM from the input area and show it" > Analyse< / button >
< button onclick = "OOMAnalyser.OOMDisplayInstance.reset_form()" title = "Clean the input area" > Reset< / button >
< button onclick = "OOMAnalyser.OOMDisplayInstance.copy_example_to_form()" title = "Copy an example OOM into the input area" > Insert example< / button >
2017-12-04 19:44:48 +01:00
< / div >
2017-11-25 12:52:55 +01:00
2019-11-24 10:23:57 +01:00
< div class = "js-text--default-hide js-text--display-none" id = "analysis" >
2017-12-04 19:44:48 +01:00
2019-11-16 10:53:07 +01:00
< h2 id = "step2" > Step 2 - Results< / h2 >
2020-01-04 14:25:41 +01:00
2017-12-04 19:44:48 +01:00
< p >
Go back to
2018-09-11 19:49:39 +02:00
< a href = "javascript:void(0);" onclick = "OOMAnalyser.OOMDisplayInstance.reset_form()" title = "Run a new analysis" > " Step 1 - Enter your OOM message" < / a >
2017-12-04 19:44:48 +01:00
to run a new analysis.
< / p >
2020-01-04 14:25:41 +01:00
< h3 > Summary< / h3 >
< div id = "explanation" >
< p >
2020-01-06 22:11:51 +01:00
The process " < span class = "trigger_proc_name" > < / span > " (PID < span class = "trigger_proc_pid" > < / span > )
requested < span class = "trigger_proc_requested_memory_pages_kb" > < / span >
(< span class = "trigger_proc_requested_memory_pages" > < / span > ) memory.
2020-01-04 14:25:41 +01:00
The system couldn't satisfy this request and started the OOM killer to free memory. The OOM killer
2020-01-06 22:11:51 +01:00
calculates a score for each process and terminates the process with the highest score
" < span class = "killed_proc_name" > < / span > " (PID < span class = "killed_proc_pid" > < / span > ) to satisfy the initial
memory request.
2020-01-04 14:25:41 +01:00
< / p >
< p >
2020-02-03 21:15:47 +01:00
The terminated process uses < span class = "killed_proc_rss_percent text--align-right" > < / span >
2020-02-01 13:09:02 +01:00
(< span class = "killed_proc_total_rss_kb" > < / span > ) resident memory and has an OOM score of
< span class = "killed_proc_score" > < / span > .
2020-01-04 14:25:41 +01:00
< / p >
< p >
2020-01-08 20:59:20 +01:00
The system has < span class = "system_total_ram_kb" > < / span > physical memory and
< span class = "swap_total_kb" > < / span > swap space. That's < span class = "system_total_ramswap_kb" > < / span > total.
2020-02-03 21:15:47 +01:00
< span class = "system_total_used_percent text--align-right" > < / span >
2020-01-31 22:10:11 +01:00
(< span class = "system_total_ram_used_kb" > < / span > out of < span class = "system_total_ram_kb" > < / span > ) physical
2020-02-03 21:15:47 +01:00
memory and < span class = "system_swap_used_percent text--align-right" > < / span >
2020-01-31 22:10:11 +01:00
(< span class = "swap_used_kb" > < / span > out of < span class = "swap_total_kb" > < / span > ) swap space are in use.
2020-01-04 14:25:41 +01:00
< / p >
< / div >
< h3 > Details of analysis< / h3 >
2017-12-20 20:26:36 +01:00
< p >
The result of the analysis is displayed in three columns. The first column is used to name the property
including the original OOM identifier in brackets. The extracted information is displayed in the second column.
The last column contains further details and additional information.
< / p >
2017-11-25 12:52:55 +01:00
< table >
<!--
< thead >
< tr >
< th scope = "col" > < / th >
< th scope = "col" > Entry< / th >
< th scope = "col" > Description< / th >
< / tr >
< / thead >
-->
< tbody >
<!-- Trigger process -->
< tr >
2020-01-31 21:46:55 +01:00
< th colspan = "3" scope = "row" > Trigger Process< / th >
2017-11-25 12:52:55 +01:00
< / tr >
< tr >
< td > < / td >
2020-01-06 22:11:51 +01:00
< td class = "text--align-right" > < span class = "trigger_proc_name" > < / span > (PID < span class = "trigger_proc_pid" > < / span > )< / td >
2019-11-04 21:14:06 +01:00
< td > This process requests memory and is triggering thereby the OOM situation.< / td >
2017-11-25 12:52:55 +01:00
< / tr >
2018-08-08 20:41:26 +02:00
< tr >
< td > Memory allocation flags< br > (gfp_mask)< / td >
2020-01-06 22:11:51 +01:00
< td class = "trigger_proc_gfp_mask text--align-right" > < / td >
2018-08-08 20:41:26 +02:00
< td > These flags are used to control the kernel internal memory allocation< br >
2019-11-04 21:14:06 +01:00
GFP stands for < code > __get_free_pages()< / code > .< / td >
2018-08-08 20:41:26 +02:00
< / tr >
< tr >
< td > Node mask to show on which CPU Cores this process can run< br > (nodemask)< / td >
2020-01-06 22:11:51 +01:00
< td class = "trigger_proc_nodemask text--align-right" > < / td >
2019-11-04 21:14:06 +01:00
< td > Bit mask indicating the cores on which the process can run.< / td >
2018-08-08 20:41:26 +02:00
< / tr >
< tr >
2018-08-12 14:18:09 +02:00
< td > Requested memory< br > (order)< / td >
2018-10-13 19:00:09 +02:00
< td class = "text--align-right" >
2020-01-06 22:11:51 +01:00
< span class = "trigger_proc_requested_memory_pages" > < / span > (2< span class = "trigger_proc_order text__superscript" > < / span > ) pages /
< span class = "trigger_proc_requested_memory_pages_kb" > < / span >
2018-08-08 20:41:26 +02:00
< / td >
< td > The kernel specifies the requested number of pages as exponent of power of two.
< / tr >
< tr >
< td > Adjust oom-killer score< br > (oom_score_adj)< / td >
2020-01-06 22:11:51 +01:00
< td class = "trigger_proc_oomscore text--align-right" > < / td >
2018-08-08 20:41:26 +02:00
< td >
This value is added to the badness score before it's used to determine the process to be killed.
< / td >
< / tr >
2017-11-25 12:52:55 +01:00
<!-- Killed Process -->
< tr >
2018-04-11 20:24:42 +02:00
< th scope = "row" colspan = "3" > Killed Process< / th >
2017-11-25 12:52:55 +01:00
< / tr >
< tr >
< td > < / td >
2020-01-06 22:11:51 +01:00
< td class = "text--align-right" >
< span class = "killed_proc_name" > < / span >
(PID < span class = "killed_proc_pid" > < / span > )
< / td >
2019-11-04 21:14:06 +01:00
< td > Process killed by Linux kernel to satisfy the memory request.< / td >
2017-11-25 12:52:55 +01:00
< / tr >
< tr >
< td > OOM Score< br > (score)< / td >
2020-01-06 22:11:51 +01:00
< td class = "killed_proc_score text--align-right" > < / td >
2019-11-04 21:17:37 +01:00
< td > Programs with the highest OOM score are terminated first.< / td >
2017-11-25 12:52:55 +01:00
< / tr >
< tr >
2020-01-05 01:00:02 +01:00
< td > Virtual Memory < br > (total_vm) < / td >
2020-02-03 21:15:47 +01:00
< td class = "killed_proc_total_vm_kb text--align-right" > < / td >
2019-11-04 21:14:06 +01:00
< td > Virtual memory used by this process.< / td >
2017-11-25 12:52:55 +01:00
< / tr >
2020-01-08 20:59:20 +01:00
< tr >
< td > Total resident anonymous memory < br > (rss)< / td >
2020-02-03 21:15:47 +01:00
< td class = "killed_proc_total_rss_kb text--align-right" > < / td >
2020-01-08 20:59:20 +01:00
< td >
All virtual process memory mapped into RAM. < br >
< code > TotalRSS = anon-rss + file-rss + shmem-rss< / code >
< / td >
< / tr >
< tr >
< td > Resident anonymous memory < br > (anon-rss)< / td >
2020-02-03 21:15:47 +01:00
< td class = "killed_proc_anon_rss_kb text--align-right" > < / td >
2020-01-08 20:59:20 +01:00
< td > Resident anonymous pages < br > Part of the virtual process memory mapped into RAM.< / td >
< / tr >
< tr >
< td > Resident file mapping memory < br > (file-rss)< / td >
2020-02-03 21:15:47 +01:00
< td class = "killed_proc_file_rss_kb text--align-right" > < / td >
2020-01-08 20:59:20 +01:00
< td >
Resident file mapping pages < br > Files which have been mapped into RAM (with
< a href = "http://man7.org/linux/man-pages/man2/mmap.2.html" > mmap(2).< / a > )
< / td >
< / tr >
< tr >
< td > Resident shared memory < br > (shmem-rss)< / td >
2020-02-03 21:15:47 +01:00
< td class = "killed_proc_shmem_rss_kb text--align-right" > < / td >
2020-01-08 20:59:20 +01:00
< td >
Resident shared memory pages < br >
This may include System V shared memory and shared anonymous memory.
< / td >
< / tr >
<!-- Memory Usage -->
< tr >
< th colspan = "3" scope = "row" > Memory Usage< / th >
< / tr >
<!-- Graphs -->
2017-11-25 12:52:55 +01:00
< tr >
2020-04-08 17:37:41 +02:00
< th class = "table__sub-section--bold" colspan = "3" scope = "row" > Graphs< / th >
2017-11-25 12:52:55 +01:00
< / tr >
< tr >
2020-01-08 20:59:20 +01:00
< td > RAM Summary< / td >
2017-11-25 12:52:55 +01:00
< td colspan = "2" > < div id = "svg_ram" > < / div > < / td >
< / tr >
< tr >
2020-01-08 20:59:20 +01:00
< td > Swap Summary< / td >
2017-11-25 12:52:55 +01:00
< td colspan = "2" > < div id = "svg_swap" > < / div > < / td >
< / tr >
2020-01-09 06:58:16 +01:00
<!-- Swap Usage -->
< tr >
2020-04-08 17:37:41 +02:00
< th class = "table__sub-section--bold" colspan = "3" scope = "row" > Swap Usage< / th >
2020-01-09 06:58:16 +01:00
< / tr >
< tr >
< td > Swap Total< / td >
2020-02-03 21:15:47 +01:00
< td class = "swap_total_kb text--align-right" > < / td >
2020-01-09 06:58:16 +01:00
< td > Total amount of swap space available.
< a class = "a__footnote" href = "#footnote-proc5" > [1]< / a >
< / td >
< / tr >
< tr >
< td > Swap Free< / td >
2020-02-03 21:15:47 +01:00
< td class = "swap_free_kb text--align-right" > < / td >
2020-01-09 06:58:16 +01:00
< td > Amount of swap space that is currently unused.
< a class = "a__footnote" href = "#footnote-proc5" > [1]< / a >
< / td >
< / tr >
< tr >
< td > Swap Cached< / td >
2020-02-03 21:15:47 +01:00
< td class = "swap_cache_kb text--align-right" > < / td >
2020-01-09 06:58:16 +01:00
< td > Memory that once was swapped out, is swapped back in
but still also is in the swap file. (If memory pressure
is high, these pages don't need to be swapped out
again because they are already in the swap file. This
saves I/O).
< a class = "a__footnote" href = "#footnote-proc5" > [1]< / a >
< / td >
< / tr >
< tr >
< td > Swap Used< / td >
2020-02-03 21:15:47 +01:00
< td class = "swap_used_kb text--align-right" > < / td >
2020-01-09 06:58:16 +01:00
< td > Amount of used swap space w/o cached swap < br >
(< code > SwapUsed = SwapTotal - SwapFree -SwapCache< / code > )
< / td >
< / tr >
2018-04-15 20:14:29 +02:00
<!-- Page Usage -->
< tr >
2020-04-08 17:37:41 +02:00
< th class = "table__sub-section--bold" colspan = "3" scope = "row" > Memory Pages< / th >
2018-04-15 20:14:29 +02:00
< / tr >
< tr >
< td > RAM pages< / td >
2020-02-03 21:15:47 +01:00
< td class = "ram_pages text--align-right" > < / td >
2020-01-08 20:59:20 +01:00
< td > Total number of RAM pages< / td >
2018-04-15 20:14:29 +02:00
< / tr >
< tr >
< td > HighMem/MovableOnly< / td >
2020-02-03 21:15:47 +01:00
< td class = "highmem_pages text--align-right" > < / td >
2018-04-15 20:14:29 +02:00
< td > Number of pages in the High Memory Area or marked movable for Contiguous Memory Allocator (CMA).
< br >
HighMem pages are also counted in the total page number.
< / td >
< / tr >
< tr >
< td > Reserved pages< / td >
2020-02-03 21:15:47 +01:00
< td class = "reserved_pages text--align-right" > < / td >
2020-01-08 20:59:20 +01:00
< td > Number of reserved pages< / td >
2018-04-15 20:14:29 +02:00
< / tr >
< tr >
< td > CMA reserved pages< / td >
2020-02-03 21:15:47 +01:00
< td class = "cma_pages text--align-right" > 0< / td >
2020-01-08 20:59:20 +01:00
< td > Pages reserved for Contiguous Memory Allocator (CMA)< / td >
2018-04-15 20:14:29 +02:00
< / tr >
< tr >
< td > Pagetable Cache< / td >
2020-02-03 21:15:47 +01:00
< td class = "pagetablecache_pages text--align-right" > 0< / td >
2020-01-08 20:59:20 +01:00
< td > Number of pages in pagetable cache< / td >
2018-04-15 20:14:29 +02:00
< / tr >
< tr >
< td > Number of pages with hardware errors< / td >
2020-02-03 21:15:47 +01:00
< td class = "hwpoisoned_pages text--align-right" > 0< / td >
2020-01-08 20:59:20 +01:00
< td > Pages with uncorrectable memory errors< / td >
2018-04-15 20:14:29 +02:00
< / tr >
<!-- Memory Usage Details -->
2017-11-25 12:52:55 +01:00
< tr >
2020-04-08 17:37:41 +02:00
< th class = "table__sub-section--bold" colspan = "3" scope = "row" > Memory Usage Details< / th >
2017-11-25 12:52:55 +01:00
< / tr >
< tr >
2020-01-08 20:59:20 +01:00
< td > Active anonymous memory < br > (active_anon)< / td >
2020-02-03 21:15:47 +01:00
< td class = "active_anon_pages text--align-right" > < / td >
2017-11-25 12:52:55 +01:00
< td > Recently used anonymous memory.< br >
These memory pages will usually not swapped out.
< / td >
< / tr >
< tr >
2017-12-20 20:26:36 +01:00
< td > Inactive anonymous memory < br > (inactive_anon)< / td >
2020-02-03 21:15:47 +01:00
< td class = "inactive_anon_pages text--align-right" > < / td >
2017-11-25 12:52:55 +01:00
< td > Least recently used anonymous memory.< br >
These memory pages can be swapped out.
< / td >
< / tr >
< tr >
2017-12-20 20:26:36 +01:00
< td > Isolated anonymous memory < br > (isolated_anon)< / td >
2020-02-03 21:15:47 +01:00
< td class = "isolated_anon_pages text--align-right" > < / td >
2017-11-25 12:52:55 +01:00
< td > Memory isolation is used to separate memory between different virtual machines.< / td >
< / tr >
< tr >
2017-12-20 20:26:36 +01:00
< td > Active Pagecache < br > (active_file)< / td >
2020-02-03 21:15:47 +01:00
< td class = "active_file_pages text--align-right" > < / td >
2017-11-25 12:52:55 +01:00
< td > Pagecache that has been used more recently and usually not reclaimed unless absolutely necessary.< / td >
< / tr >
< tr >
2017-12-20 20:26:36 +01:00
< td > Inactive Pagecache < br > (inactive_file)< / td >
2020-02-03 21:15:47 +01:00
< td class = "inactive_file_pages text--align-right" > < / td >
2017-11-25 12:52:55 +01:00
< td > Pagecache which has been less recently used. It can be reclaimed without huge performance impact.< / td >
< / tr >
< tr >
2017-12-20 20:26:36 +01:00
< td > Isolated Pagecache < br > (isolated_file)< / td >
2020-02-03 21:15:47 +01:00
< td class = "isolated_file_pages text--align-right" > < / td >
2017-11-25 12:52:55 +01:00
< td > Memory isolation is used to separate memory between different virtual machines.< / td >
< / tr >
< tr >
2017-12-20 20:26:36 +01:00
< td > Unevictable Pages < br > (unevictable)< / td >
2020-02-03 21:15:47 +01:00
< td class = "unevictable_pages text--align-right" > < / td >
2017-11-25 12:52:55 +01:00
< td > Unevictable memory. It can't be swapped out because the pages are owned by ramfs or protected by
< a href = "http://man7.org/linux/man-pages/man3/mlock.5.html" target = "_blank" > mlock(3)< / a > /
< a href = "http://man7.org/linux/man-pages/man2/shmctl.2.html" target = "_blank" > shmctl(SHM_LOCK)< / a > .
Unevictable pages are managed by kernels LRU framework.
< / td >
< / tr >
< tr >
2017-12-20 20:26:36 +01:00
< td > Dirty Pages < br > (dirty)< / td >
2020-02-03 21:15:47 +01:00
< td class = "dirty_pages text--align-right" > < / td >
2017-12-04 19:44:48 +01:00
< td > Memory which is waiting to get written back to the disk.
2018-10-13 19:12:13 +02:00
< a class = "a__footnote" href = "#footnote-proc5" > [1]< / a >
2017-11-25 12:52:55 +01:00
< / td >
< / tr >
< tr >
2017-12-20 20:26:36 +01:00
< td > Writeback < br > (writeback)< / td >
2020-02-03 21:15:47 +01:00
< td class = "writeback_pages text--align-right" > < / td >
2017-11-25 12:52:55 +01:00
< td >
Memory which is actively being written back to the disk.
2018-10-13 19:12:13 +02:00
< a class = "a__footnote" href = "#footnote-proc5" > [1]< / a >
2017-11-25 12:52:55 +01:00
< / td >
< / tr >
< tr >
2017-12-20 20:26:36 +01:00
< td > Unstable < br > (unstable)< / td >
2020-02-03 21:15:47 +01:00
< td class = "unstable_pages text--align-right" > < / td >
2017-11-25 12:52:55 +01:00
< td > Not yet committed to stable storage.< / td >
< / tr >
< tr >
2017-12-20 20:26:36 +01:00
< td > Slab Reclaimable < br > (slab_reclaimable)< / td >
2020-02-03 21:15:47 +01:00
< td class = "slab_reclaimable_pages text--align-right" > < / td >
2017-11-25 12:52:55 +01:00
< td >
Slab is a in-kernel data structures cache. Part of Slab, that might be reclaimed, such as caches.
2018-10-13 19:12:13 +02:00
< a class = "a__footnote" href = "#footnote-proc5" > [1]< / a >
2017-11-25 12:52:55 +01:00
< br >
Additional details are listed in
< a href = "http://man7.org/linux/man-pages/man5/slabinfo.5.html" target = "_blank" > slabinfo(5)< / a > also.
< / td >
< / tr >
< tr >
2017-12-20 20:26:36 +01:00
< td > Slab Unreclaimable < br > (slab_unreclaimable)< / td >
2020-02-03 21:15:47 +01:00
< td class = "slab_unreclaimable_pages text--align-right" > < / td >
2017-11-25 12:52:55 +01:00
< td >
Part of Slab, that cannot be reclaimed on memory pressure.
2018-10-13 19:12:13 +02:00
< a class = "a__footnote" href = "#footnote-proc5" > [1]< / a >
2017-11-25 12:52:55 +01:00
< / td >
< / tr >
< tr >
2017-12-20 20:26:36 +01:00
< td > Mapped < br > (mapped)< / td >
2020-02-03 21:15:47 +01:00
< td class = "mapped_pages text--align-right" > < / td >
2017-11-25 12:52:55 +01:00
< td >
Files which have been mapped into memory (with
< a href = "http://man7.org/linux/man-pages/man2/mmap.2.html" > mmap(2)< / a > ), such as libraries.
2018-10-13 19:12:13 +02:00
< a class = "a__footnote" href = "#footnote-proc5" > [1]< / a >
2017-11-25 12:52:55 +01:00
< / td >
< / tr >
< tr >
2017-12-20 20:26:36 +01:00
< td > Shared Memory < br > (shmem)< / td >
2020-02-03 21:15:47 +01:00
< td class = "shmem_pages text--align-right" > < / td >
2017-11-25 12:52:55 +01:00
< td >
Amount of memory consumed in
< a href = "http://man7.org/linux/man-pages/man5/tmpfs.5.html" > tmpfs(5)< / a >
filesystems.
2018-10-13 19:12:13 +02:00
< a class = "a__footnote" href = "#footnote-proc5" > [1]< / a >
2017-11-25 12:52:55 +01:00
< / td >
< / tr >
< tr >
2017-12-20 20:26:36 +01:00
< td > Pagetables < br > (pagetables)< / td >
2020-02-03 21:15:47 +01:00
< td class = "pagetables_pages text--align-right" > < / td >
2017-11-25 12:52:55 +01:00
< td >
Amount of memory dedicated to the lowest level of pagetables.
2018-10-13 19:12:13 +02:00
< a class = "a__footnote" href = "#footnote-proc5" > [1]< / a >
2017-11-25 12:52:55 +01:00
< / td >
< / tr >
< tr >
2017-12-20 20:26:36 +01:00
< td > Bounce < br > (bounce)< / td >
2020-02-03 21:15:47 +01:00
< td class = "bounce_pages text--align-right" > < / td >
2017-11-25 12:52:55 +01:00
< td >
Memory used for block device "bounce buffers".
2018-10-13 19:12:13 +02:00
< a class = "a__footnote" href = "#footnote-proc5" > [1]< / a >
2017-11-25 12:52:55 +01:00
< / td >
< / tr >
< tr >
2017-12-20 20:26:36 +01:00
< td > free < br > (free)< / td >
2020-02-03 21:15:47 +01:00
< td class = "free_pages text--align-right" > < / td >
2017-11-25 12:52:55 +01:00
< td > < / td >
< / tr >
< tr >
2017-12-20 20:26:36 +01:00
< td > free_pcp < br > (free_pcp)< / td >
2020-02-03 21:15:47 +01:00
< td class = "free_pcp_pages text--align-right" > < / td >
2017-11-25 12:52:55 +01:00
< td > < / td >
< / tr >
< tr >
2017-12-20 20:26:36 +01:00
< td > free_cma < br > (free_cma)< / td >
2020-02-03 21:15:47 +01:00
< td class = "free_cma_pages text--align-right" > < / td >
2017-11-25 12:52:55 +01:00
< td > < / td >
< / tr >
< tr >
< td > Total Pagecache< / td >
2020-02-03 21:15:47 +01:00
< td class = "pagecache_total_pages text--align-right" > < / td >
2017-11-25 12:52:55 +01:00
< td > < / td >
< / tr >
<!-- Operating System -->
< tr >
< th scope = "row" colspan = "3" > Operating System< / th >
< / tr >
< tr >
< td > Kernel< / td >
2020-03-25 19:42:46 +01:00
< td class = "kernel_version text--align-right text--align-right" > < / td >
2017-11-25 12:52:55 +01:00
< td > < / td >
< / tr >
< tr >
< td > Distribution< / td >
2020-03-25 19:42:46 +01:00
< td class = "dist text--align-right text--align-right" > < / td >
2017-11-25 12:52:55 +01:00
< td > Guessed from the kernel version< / td >
< / tr >
< tr >
< td > Platform< / td >
2020-03-25 19:42:46 +01:00
< td class = "platform text--align-right text--align-right" > < / td >
2017-11-25 12:52:55 +01:00
< td > Guessed from the kernel version< / td >
< / tr >
< tr >
< td > Page size< / td >
2020-02-03 21:15:47 +01:00
< td class = "page_size_kb text--align-right" > < / td >
2017-11-25 12:52:55 +01:00
< td > Guessed< / td >
< / tr >
<!-- Memory Chunks -->
< tr >
2020-01-09 06:54:44 +01:00
< th colspan = "3" scope = "row" > Memory Chunks< / th >
2017-11-25 12:52:55 +01:00
< / tr >
< tr >
< td > < / td >
< td colspan = "2" class = "terminal" >
2020-02-03 06:18:40 +01:00
< pre class = "mem_node_info" > < / pre >
2017-11-25 12:52:55 +01:00
< / td >
< / tr >
< tr >
2020-03-26 13:46:20 +01:00
< th colspan = "3" scope = "row" > Process Table< / th >
2017-11-25 12:52:55 +01:00
< / tr >
< tr >
< td > < / td >
2020-03-26 13:46:20 +01:00
< td class = "terminal " colspan = "2" >
< table class = "pstable__table--noborder" >
< thead >
< tr >
2020-04-05 14:28:37 +02:00
< td class = "pstable__row-pid--width" > pid
< a class = "pstable__row-sort--width" href = "javascript:void(0);"
id="pstable_sort_pid" onclick="OOMAnalyser.OOMDisplayInstance.sort_pstable('pid')">< / a >
< / td >
< td class = "pstable__row-numeric--width" > uid
< a class = "pstable__row-sort--width" href = "javascript:void(0);"
id="pstable_sort_uid" onclick="OOMAnalyser.OOMDisplayInstance.sort_pstable('uid')">< / a >
< / td >
< td class = "pstable__row-numeric--width" > tgid
< a class = "pstable__row-sort--width" href = "javascript:void(0);"
id="pstable_sort_tgid" onclick="OOMAnalyser.OOMDisplayInstance.sort_pstable('tgid')">< / a >
< / td >
< td class = "pstable__row-pages--width" > total_vm
< a class = "pstable__row-sort--width" href = "javascript:void(0);"
id="pstable_sort_total_vm_pages" onclick="OOMAnalyser.OOMDisplayInstance.sort_pstable('total_vm_pages')">< / a >
< / td >
< td class = "pstable__row-pages--width" > rss
< a class = "pstable__row-sort--width" href = "javascript:void(0);"
id="pstable_sort_rss_pages" onclick="OOMAnalyser.OOMDisplayInstance.sort_pstable('rss_pages')">< / a >
< / td >
< td class = "pstable__row-pages--width" > nr_ptes
< a class = "pstable__row-sort--width" href = "javascript:void(0);"
id="pstable_sort_nr_ptes_pages" onclick="OOMAnalyser.OOMDisplayInstance.sort_pstable('nr_ptes_pages')">< / a >
< / td >
< td class = "pstable__row-pages--width" > swapents
< a class = "pstable__row-sort--width" href = "javascript:void(0);"
id="pstable_sort_swapents_pages" onclick="OOMAnalyser.OOMDisplayInstance.sort_pstable('swapents_pages')">< / a >
< / td >
< td class = "pstable__row-oom-score-adj--width" > oom_score_adj
< a class = "pstable__row-sort--width" href = "javascript:void(0);"
id="pstable_sort_oom_score_adj" onclick="OOMAnalyser.OOMDisplayInstance.sort_pstable('oom_score_adj')">< / a >
< / td >
< td > name
< a class = "pstable__row-sort--width" href = "javascript:void(0);"
id="pstable_sort_name" onclick="OOMAnalyser.OOMDisplayInstance.sort_pstable('name')">< / a >
< / td >
< td > notes
< a class = "pstable__row-sort--width" href = "javascript:void(0);"
id="pstable_sort_notes" onclick="OOMAnalyser.OOMDisplayInstance.sort_pstable('notes')">< / a >
< / td >
2020-03-26 13:46:20 +01:00
< / tr >
< / thead >
< tbody id = "process_table" >
< / tbody >
< / table >
2017-11-25 12:52:55 +01:00
< / td >
< / tr >
<!-- Hardware Details -->
< tr >
2020-01-09 06:54:44 +01:00
< th colspan = "3" scope = "row" > Hardware Details< / th >
2017-11-25 12:52:55 +01:00
< / tr >
< tr >
< td > < / td >
< td colspan = "2" class = "terminal" >
2020-02-03 06:18:40 +01:00
< pre class = "hardware_info" > < / pre >
2017-11-25 12:52:55 +01:00
< / td >
< / tr >
<!-- Kernel Call Tree -->
< tr >
2020-01-09 06:54:44 +01:00
< th colspan = "3" scope = "row" > Kernel Call Trace< / th >
2017-11-25 12:52:55 +01:00
< / tr >
< tr >
< td > < / td >
< td colspan = "2" class = "terminal" >
2020-02-03 06:18:40 +01:00
< pre class = "call_trace" > < / pre >
2017-11-25 12:52:55 +01:00
< / td >
< / tr >
2017-12-04 19:44:48 +01:00
<!-- Initial OOM -->
< tr >
2020-01-09 06:54:44 +01:00
< th colspan = "3" scope = "row" > Entire OOM Message
2018-10-13 19:00:09 +02:00
< a class = "a--small" href = "javascript:void(0);" id = "oom_toogle_msg" onclick = "OOMAnalyser.OOMDisplayInstance.toggle_oom()" title = "Click to show/hide full OOM message" > (click to hide)< / a >
2018-08-12 13:34:24 +02:00
< / th >
2017-12-04 19:44:48 +01:00
< / tr >
< tr >
< td > < / td >
< td colspan = "2" class = "terminal" >
< pre id = "oom" > < / pre >
< / td >
< / tr >
2017-11-25 12:52:55 +01:00
< / tbody >
< / table >
2017-12-04 19:44:48 +01:00
< p >
Go back to
2019-10-30 21:20:31 +01:00
< a href = "javascript:void(0);" onclick = "OOMAnalyser.OOMDisplayInstance.reset_form()" title = "Run a new analysis" > " Step 1 - Enter your OOM message" < / a >
2017-12-04 19:44:48 +01:00
to run a new analysis.
< / p >
2019-11-16 10:53:07 +01:00
< h2 id = "h2-footnotes" > Footnotes< / h2 >
2017-11-27 20:51:36 +01:00
< ol >
< li id = "footnote-proc5" > < cite > < a href = "http://man7.org/linux/man-pages/man5/proc.5.html" target = "_blank" >
proc(5) - process information pseudo-filesystem< / a > < / cite > (< a href = "#" onclick = "goBack()" > Go Back< / a > )
< / li >
< / ol >
2017-11-25 12:52:55 +01:00
< / div >
2019-11-16 10:53:07 +01:00
< h2 id = "infos" > Further Information< / h2 >
2017-12-14 07:35:52 +01:00
< ol >
2020-01-09 06:44:25 +01:00
< li >
< a href = "https://man7.org/" > Linux man pages online< / a >
< / li >
< li >
< a href = "https://utcc.utoronto.ca/~cks/space/blog/linux/DecodingPageAllocFailures" >
Decoding the Linux kernel's page allocation failure messages
< / a >
< / li >
< li >
< a href = "http://elearningmedium.com/linux-kernel-oom-log-analysis/" > Linux Kernel OOM Log Analysis< / a >
< / li >
< li >
< a href = "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git" > Kernel Source code< / a > with
< a href = "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/mm/oom_kill.c" > < code > mm/omm_kill.c< / code > < / a >
as starting point at < a href = "https://www.kernel.org" > kernel.org< / a >
< / li >
< li >
A more comfortable kernel source code browser with
< a href = "https://elixir.bootlin.com/linux/latest/source/mm/oom_kill.c" > < code > mm/omm_kill.c< / code > < / a > at
< a href = "https://elixir.bootlin.com/" > elixir.bootlin.com< / a >
< / li >
2017-12-14 07:35:52 +01:00
< / ol >
2019-11-21 07:50:01 +01:00
< div >
< h2 class = "h2--no-newline" id = "changes" > Changelog< / h2 >
2019-11-13 21:12:29 +01:00
< a class = "a--small" href = "javascript:void(0);" onclick = "OOMAnalyser.toggle('changelog')"
title="Show / hide news">(click to show / hide)< / a >
2019-11-21 07:50:01 +01:00
< / div >
2019-11-13 21:12:29 +01:00
2019-11-24 10:23:57 +01:00
< div class = "js-text--default-hide js-text--display-none" id = "changelog" >
2019-12-01 17:32:18 +01:00
< h3 > Version 0.4.0 - 2020-XX-XX:< / h3 >
< h4 > General< / h4 >
< ol >
2020-01-04 14:25:41 +01:00
< li > Add a textual summary of the analysis< / li >
2020-01-05 01:12:58 +01:00
< li > Fix calculation of requested memory in kBytes< / li >
2020-02-03 21:15:47 +01:00
< li > Fix issue that prevents units from being copied< / li >
2020-03-26 13:46:20 +01:00
< li > Show additional information in process table< / li >
2020-04-05 14:28:37 +02:00
< li > Add sorting process table< / li >
2020-07-15 20:43:44 +02:00
< li > Fix: Trigger process isn't part of process table< / li >
2019-12-01 17:32:18 +01:00
< li > ...< / li >
< / ol >
< h4 > Note< / h4 >
See the
< a href = "https://github.com/CarstenGrohmann/OOMAnalyser/compare/v0.3.0...master"
title="commit history">commit history< / a >
of the repository for a full list of changes.
2019-11-24 10:46:44 +01:00
< h3 > Version 0.3.0 - 2019-11-24:< / h3 >
2019-11-13 21:12:29 +01:00
< h4 > General< / h4 >
< ol >
2019-11-24 10:46:44 +01:00
< li > Improve presentation< / li >
2019-11-13 21:12:29 +01:00
< li > Separate analysis and visualisation code< / li >
< li > Use CSS classes to control the visibility< / li >
< li > Strip columns left to the message automatically< / li >
< li > Lot if internal improvements and restructuring< / li >
2019-11-24 10:46:44 +01:00
< li > Bug fixes< / li >
2019-11-13 21:12:29 +01:00
< / ol >
2019-11-24 10:46:44 +01:00
<!--
2019-11-13 21:12:29 +01:00
< h4 > Known issues< / h4 >
< ol >
< li > none< / li >
< / ol >
2019-11-24 10:46:44 +01:00
-->
2019-11-13 21:12:29 +01:00
< h4 > Note< / h4 >
2019-11-24 10:46:44 +01:00
See the
< a href = "https://github.com/CarstenGrohmann/OOMAnalyser/compare/v0.2.0...v0.3.0"
title="commit history">commit history< / a >
of the repository for a full list of changes.
2019-11-13 21:12:29 +01:00
< / div >
2019-11-21 07:50:01 +01:00
< div >
< h2 class = "h2--no-newline" id = "install" > Local Installation< / h2 >
2019-02-10 18:15:02 +01:00
< a class = "a--small" href = "javascript:void(0);" onclick = "OOMAnalyser.toggle('installation')"
title="Show / hide installation guide">(click to show / hide)< / a >
2019-11-21 07:50:01 +01:00
< / div >
2019-02-10 18:15:02 +01:00
2019-11-24 10:23:57 +01:00
< div class = "js-text--default-hide js-text--display-none" id = "installation" >
2019-02-10 18:15:02 +01:00
Installing OOMAnalyser is quite easy since OOMAnalyser consists only of two files, a
HTML file and a JavaScript file. Both can be stored locally to use OOMAnalyser
without an Internet connection.
< h3 > Installation steps< / h3 >
< ol >
< li > Create an own directory and add a < code > __javascript__< / code > subdirectory< / li >
< li > Download the < a download = "OOMAnalyser.html" href = "OOMAnalyser.html" > HTML file< / a > to the main directory and
the < a download = "OOMAnalyser.js" href = "__javascript__/OOMAnalyser.js" > JavaScript file< / a > to the
< code > __javascript__< / code > subdirectory
< / li >
< li > Open the file < code > OOMAnalyser.html< / code > in your favourite browser.< / li >
< / ol >
< / div >
2017-11-25 12:52:55 +01:00
< hr / >
< div class = "footer" >
2017-11-27 21:05:31 +01:00
OOMAnalyser < span id = "version" > < / span > |
2020-01-02 20:58:01 +01:00
Copyright (C) 2017-2020 Carsten Grohmann |
2017-11-25 12:52:55 +01:00
< a href = "javascript:void(0);" onclick = "OOMAnalyser.toggle('license')" title = "Show / hide license text" > License: MIT< / a > |
< a href = "https://github.com/CarstenGrohmann/OOMAnalyser" title = "Source code on GitHub" > Source Code on GitHub< / a >
< / div >
2018-10-16 19:50:33 +02:00
< div class = "license__text js-text--display-none" id = "license" >
2017-11-25 12:52:55 +01:00
< p >
2020-01-02 20:58:01 +01:00
Copyright (c) 2017-2020 Carsten Grohmann mail < add at here> carsten-grohmann.de
2017-11-25 12:52:55 +01:00
< / p >
< p >
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
of the Software, and to permit persons to whom the Software is furnished to do
so, subject to the following conditions:
< / p >
< p >
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
< / p >
< p >
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
< / p >
< / div >
< / body >
2017-12-12 19:24:31 +01:00
< / html >