Replace plain text process table by an HTML table

and mark the trigger process and the killed process.
This commit is contained in:
Carsten Grohmann 2020-03-26 13:46:20 +01:00
parent c62d3952da
commit 54e4f566a4
2 changed files with 113 additions and 14 deletions

View File

@ -66,6 +66,47 @@
width: 100%;
}
.pstable__table--noborder * {
border: none;
text-align: right;
background-color: unset;
padding-left: 5px;
padding-right: 5px;
table-layout: auto;
white-space: nowrap;
}
.pstable__table--noborder thead {
font-weight: bold;
}
/* 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 {
width: 4ch;
}
.pstable__row-numeric--width {
width: 6ch;
}
.pstable__row-pages--width {
width: 12ch;
}
.pstable__row-oom-score-adj--width {
width: 16ch;
}
th {
font-weight: bold;
font-size: large;
@ -582,12 +623,29 @@ function goBack() {
</tr>
<tr>
<th scope="row" colspan="3">Process Table</th>
<th colspan="3" scope="row">Process Table</th>
</tr>
<tr>
<td></td>
<td colspan="2" class="terminal">
<pre class="process_table"></pre>
<td class="terminal " colspan="2">
<table class="pstable__table--noborder">
<thead>
<tr>
<td class="pstable__row-pid--width">pid</td>
<td class="pstable__row-numeric--width">uid</td>
<td class="pstable__row-numeric--width">tgid</td>
<td class="pstable__row-pages--width">total_vm</td>
<td class="pstable__row-pages--width">rss</td>
<td class="pstable__row-pages--width">nr_ptes</td>
<td class="pstable__row-pages--width">swapents</td>
<td class="pstable__row-oom-score-adj--width">oom_score_adj</td>
<td>name</td>
<td></td>
</tr>
</thead>
<tbody id="process_table">
</tbody>
</table>
</td>
</tr>
@ -684,6 +742,7 @@ function goBack() {
<li>Add a textual summary of the analysis</li>
<li>Fix calculation of requested memory in kBytes</li>
<li>Fix issue that prevents units from being copied</li>
<li>Show additional information in process table</li>
<li>...</li>
</ol>

View File

@ -337,11 +337,6 @@ class OOMAnalyser(object):
r')?',
re.MULTILINE)
REC_PROCESS_TABLE = re.compile(
r'^\[ pid \].*(?:\n)'
r'(^(\[[ \d]+.+)(?:\n))+',
re.MULTILINE)
REC_PROCESS_LINE = re.compile(
r'^\[(?P<pid>[ \d]+)\]\s+(?P<uid>\d+)\s+(?P<tgid>\d+)\s+(?P<total_vm_pages>\d+)\s+(?P<rss_pages>\d+)\s+'
r'(?P<nr_ptes_pages>\d+)\s+(?P<swapents_pages>\d+)\s+(?P<oom_score_adj>-?\d+)\s+(?P<name>.+)\s*')
@ -464,12 +459,9 @@ class OOMAnalyser(object):
gd = match.groupdict()
self.results.update(match.groupdict())
for groupname, rec in [('mem_node_info', self.REC_MEM_NODEINFO),
('process_table', self.REC_PROCESS_TABLE),
]:
match = rec.search(self.oom_entity.text)
match = self.REC_MEM_NODEINFO.search(self.oom_entity.text)
if match:
self.results[groupname] = match.group()
self.results['mem_node_info'] = match.group()
self.results['hardware_info'] = self._extract_block_from_next_pos('Hardware name:')
@ -599,6 +591,7 @@ class OOMAnalyser(object):
except:
error('Converting process parameter "{}={}" to integer failed'.format(item, process[item]))
converted['name'] = process['name']
pid_int = int(pid_str)
del ps[pid_str]
ps[pid_int] = converted
@ -955,6 +948,45 @@ Killed process 6576 (java) total-vm:33914892kB, anon-rss:20629004kB, file-rss:0k
toc_content.innerHTML = new_toc
def update_process_table(self):
"""
Re-create the process table with additional information
"""
new_table = ''
table_content = document.getElementById('process_table')
for pid in self.oom_details['_processes'].keys():
if pid == self.oom_details['trigger_proc_pid']:
comment = 'trigger process'
css_class = 'class="js-pstable__triggerproc--bgcolor"'
# css_class = 'class="js-pstable__killedproc--bgcolor"'
elif pid == self.oom_details['killed_proc_pid']:
comment = 'killed process'
css_class = 'class="js-pstable__killedproc--bgcolor"'
else:
comment = ''
css_class = ''
process = self.oom_details['_processes'][pid]
line = """
<tr {}>
<td>{}</td>
<td>{}</td>
<td>{}</td>
<td>{}</td>
<td>{}</td>
<td>{}</td>
<td>{}</td>
<td>{}</td>
<td>{}</td>
<td>{}</td>
</tr>
""".format(css_class, pid, process['uid'], process['tgid'], process['total_vm_pages'], process['rss_pages'],
process['nr_ptes_pages'], process['swapents_pages'], process['oom_score_adj'], process['name'],
comment)
new_table += line
table_content.innerHTML = new_table
def set_HTML_defaults(self, clean_oom=True):
"""Reset the HTML document but don't clean elements"""
if clean_oom:
@ -977,6 +1009,11 @@ Killed process 6576 (java) total-vm:33914892kB, anon-rss:20629004kB, file-rss:0k
while element.firstChild:
element.removeChild(element.firstChild)
# clear process table
element = document.getElementById('process_table')
while element.firstChild:
element.removeChild(element.firstChild)
# remove svg charts
for element_id in ('svg_swap', 'svg_ram'):
element = document.getElementById(element_id)
@ -1153,6 +1190,9 @@ Killed process 6576 (java) total-vm:33914892kB, anon-rss:20629004kB, file-rss:0k
continue
self._set_item(item)
# generate process table
self.update_process_table()
# generate swap usage diagram
svg_swap = self.svg_generate_bar_chart(
('Swap Used', self.oom_details['swap_used_kb']),