Added additional column to monitor OOM killer score of each process

This commit is contained in:
Leigh Simpson 2014-01-29 22:41:55 +00:00
parent 558b001e2b
commit da236ca318
6 changed files with 72 additions and 0 deletions

View File

@ -81,6 +81,9 @@ typedef enum ProcessField_ {
#ifdef HAVE_CGROUP #ifdef HAVE_CGROUP
CGROUP, CGROUP,
#endif #endif
#ifdef HAVE_OOM
OOM,
#endif
IO_PRIORITY, IO_PRIORITY,
LAST_PROCESSFIELD LAST_PROCESSFIELD
} ProcessField; } ProcessField;
@ -177,6 +180,9 @@ typedef struct Process_ {
#ifdef HAVE_CGROUP #ifdef HAVE_CGROUP
char* cgroup; char* cgroup;
#endif #endif
#ifdef HAVE_OOM
unsigned int oom;
#endif
} Process; } Process;
}*/ }*/
@ -202,6 +208,9 @@ const char *Process_fieldNames[] = {
#endif #endif
#ifdef HAVE_CGROUP #ifdef HAVE_CGROUP
"CGROUP", "CGROUP",
#endif
#ifdef HAVE_OOM
"OOM",
#endif #endif
"IO_PRIORITY", "IO_PRIORITY",
"*** report bug! ***" "*** report bug! ***"
@ -228,6 +237,9 @@ const int Process_fieldFlags[] = {
#endif #endif
#ifdef HAVE_CGROUP #ifdef HAVE_CGROUP
PROCESS_FLAG_CGROUP, PROCESS_FLAG_CGROUP,
#endif
#ifdef HAVE_OOM
0,
#endif #endif
PROCESS_FLAG_IOPRIO PROCESS_FLAG_IOPRIO
}; };
@ -253,6 +265,9 @@ const char *Process_fieldTitles[] = {
#endif #endif
#ifdef HAVE_CGROUP #ifdef HAVE_CGROUP
" CGROUP ", " CGROUP ",
#endif
#ifdef HAVE_OOM
" OOM ",
#endif #endif
"IO ", "IO ",
"*** report bug! ***" "*** report bug! ***"
@ -276,6 +291,9 @@ void Process_getMaxPid() {
Process_fieldTitles[TGID] = " TGID "; Process_fieldTitles[TGID] = " TGID ";
Process_fieldTitles[PGRP] = " PGRP "; Process_fieldTitles[PGRP] = " PGRP ";
Process_fieldTitles[SESSION] = " SESN "; Process_fieldTitles[SESSION] = " SESN ";
#ifdef HAVE_OOM
Process_fieldTitles[OOM] = " OOM ";
#endif
Process_pidFormat = "%7u "; Process_pidFormat = "%7u ";
Process_tpgidFormat = "%7d "; Process_tpgidFormat = "%7d ";
} else { } else {
@ -285,6 +303,9 @@ void Process_getMaxPid() {
Process_fieldTitles[TGID] = " TGID "; Process_fieldTitles[TGID] = " TGID ";
Process_fieldTitles[PGRP] = " PGRP "; Process_fieldTitles[PGRP] = " PGRP ";
Process_fieldTitles[SESSION] = " SESN "; Process_fieldTitles[SESSION] = " SESN ";
#ifdef HAVE_OOM
Process_fieldTitles[OOM] = " OOM ";
#endif
Process_pidFormat = "%5u "; Process_pidFormat = "%5u ";
Process_tpgidFormat = "%5d "; Process_tpgidFormat = "%5d ";
} }
@ -545,6 +566,9 @@ static void Process_writeField(Process* this, RichString* str, ProcessField fiel
#ifdef HAVE_CGROUP #ifdef HAVE_CGROUP
case CGROUP: snprintf(buffer, n, "%-10s ", this->cgroup); break; case CGROUP: snprintf(buffer, n, "%-10s ", this->cgroup); break;
#endif #endif
#ifdef HAVE_OOM
case OOM: snprintf(buffer, n, Process_pidFormat, this->oom); break;
#endif
case IO_PRIORITY: { case IO_PRIORITY: {
int klass = IOPriority_class(this->ioPriority); int klass = IOPriority_class(this->ioPriority);
if (klass == IOPRIO_CLASS_NONE) { if (klass == IOPRIO_CLASS_NONE) {
@ -814,6 +838,10 @@ int Process_compare(const void* v1, const void* v2) {
case CGROUP: case CGROUP:
return strcmp(p1->cgroup ? p1->cgroup : "", p2->cgroup ? p2->cgroup : ""); return strcmp(p1->cgroup ? p1->cgroup : "", p2->cgroup ? p2->cgroup : "");
#endif #endif
#ifdef HAVE_OOM
case OOM:
return (p1->oom - p2->oom);
#endif
case IO_PRIORITY: case IO_PRIORITY:
return Process_effectiveIOPriority(p1) - Process_effectiveIOPriority(p2); return Process_effectiveIOPriority(p1) - Process_effectiveIOPriority(p2);
default: default:

View File

@ -60,6 +60,9 @@ typedef enum ProcessField_ {
#ifdef HAVE_CGROUP #ifdef HAVE_CGROUP
CGROUP, CGROUP,
#endif #endif
#ifdef HAVE_OOM
OOM,
#endif
IO_PRIORITY, IO_PRIORITY,
LAST_PROCESSFIELD LAST_PROCESSFIELD
} ProcessField; } ProcessField;
@ -156,6 +159,9 @@ typedef struct Process_ {
#ifdef HAVE_CGROUP #ifdef HAVE_CGROUP
char* cgroup; char* cgroup;
#endif #endif
#ifdef HAVE_OOM
unsigned int oom;
#endif
} Process; } Process;

View File

@ -660,6 +660,28 @@ static void ProcessList_readVServerData(Process* process, const char* dirname, c
#endif #endif
#ifdef HAVE_OOM
static void ProcessList_readOomData(Process* process, const char* dirname, const char* name) {
char filename[MAX_NAME+1];
snprintf(filename, MAX_NAME, "%s/%s/oom_score", dirname, name);
FILE* file = fopen(filename, "r");
if (!file)
return;
char buffer[256];
if (!fgets(buffer, 255, file)) {
return;
}
unsigned int oom;
int ok = sscanf(buffer, "%u", &oom);
if (ok >= 1) {
process->oom = oom;
}
fclose(file);
}
#endif
static bool ProcessList_readCmdlineFile(Process* process, const char* dirname, const char* name) { static bool ProcessList_readCmdlineFile(Process* process, const char* dirname, const char* name) {
if (Process_isKernelThread(process)) if (Process_isKernelThread(process))
return true; return true;
@ -784,6 +806,10 @@ static bool ProcessList_processEntries(ProcessList* this, const char* dirname, P
ProcessList_readVServerData(process, dirname, name); ProcessList_readVServerData(process, dirname, name);
#endif #endif
#ifdef HAVE_OOM
ProcessList_readOomData(process, dirname, name);
#endif
if (! ProcessList_readCmdlineFile(process, dirname, name)) if (! ProcessList_readCmdlineFile(process, dirname, name))
goto errorReadingProcess; goto errorReadingProcess;

View File

@ -172,6 +172,10 @@ void ProcessList_sort(ProcessList* this);
#endif #endif
#ifdef HAVE_OOM
#endif
void ProcessList_scan(ProcessList* this); void ProcessList_scan(ProcessList* this);

View File

@ -145,5 +145,10 @@ then
AC_CHECK_HEADERS([hwloc.h],[:], [missing_headers="$missing_headers $ac_header"]) AC_CHECK_HEADERS([hwloc.h],[:], [missing_headers="$missing_headers $ac_header"])
fi fi
AC_ARG_ENABLE(oom, [AC_HELP_STRING([--enable-oom], [enable OOM score reporting])], ,enable_oom="no")
if test "x$enable_oom" = xyes; then
AC_DEFINE(HAVE_OOM, 1, [Define if OOM score support enabled.])
fi
AC_CONFIG_FILES([Makefile htop.1]) AC_CONFIG_FILES([Makefile htop.1])
AC_OUTPUT AC_OUTPUT

View File

@ -313,6 +313,9 @@ OpenVZ process ID.
.B VXID .B VXID
VServer process ID. VServer process ID.
.TP .TP
.B OOM
OOM killer score.
.TP
.B All other flags .B All other flags
Currently unsupported (always displays '-'). Currently unsupported (always displays '-').