Richard, Thank you for the patch. I'm a bit busy right now but I'll look closely into it in the next few days.
Seth and everyone else reading this, all feedback regarding the behavior and usefulness of this patch is extremely welcome. This is a major UI change if we adopt this, so I need to be sure it's for the best (I'll most likely use it myself for a while to try it out when I get around to test it.) Thank you, -- Hisham On Wed, Jan 30, 2013 at 6:30 PM, Seth <[email protected]> wrote: > Nice work. Patch applies cleanly to ubuntu 12.10 packaged version. I > will run with this for a while to see what it does for me. > > (Note I'm not affiliated with this project, so my attention is in no way > official.) > Seth > > On 01/30/2013 09:05 PM, Richard Braun wrote: >> Monitoring the amount of dirty memory helps understanding how memory and >> I/O behave depending on the workload. This can in turn be used (mostly >> by system administrators and advanced users) to tune some VM parameters, >> such as vm.dirty_background_ratio and vm.dirty_ratio. >> >> The new "dirty" value reported in the memory meter actually includes >> both the Dirty (waiting to be written back) and Writeback (being written >> back) counters of the meminfo procfs file. In order to avoid consuming >> too much screen space, the previous "buffers" and "cache" values are >> merged in the latter, which now stands for clean cached memory. Total >> memory is then divided between "used", "dirty", "cached" (clean), and >> unused. >> --- >> CRT.c | 14 +++++++------- >> CRT.h | 2 +- >> MemoryMeter.c | 19 ++++++++++--------- >> ProcessList.c | 10 ++++++++++ >> ProcessList.h | 2 ++ >> htop.c | 2 +- >> 6 files changed, 31 insertions(+), 18 deletions(-) >> >> diff --git a/CRT.c b/CRT.c >> index 3a1eb91..00e95f2 100644 >> --- a/CRT.c >> +++ b/CRT.c >> @@ -83,7 +83,7 @@ typedef enum ColorElements_ { >> GRAPH_8, >> GRAPH_9, >> MEMORY_USED, >> - MEMORY_BUFFERS, >> + MEMORY_DIRTY, >> MEMORY_CACHE, >> LOAD, >> LOAD_AVERAGE_FIFTEEN, >> @@ -281,7 +281,7 @@ void CRT_setColors(int colorScheme) { >> CRT_colors[GRAPH_8] = A_DIM; >> CRT_colors[GRAPH_9] = A_DIM; >> CRT_colors[MEMORY_USED] = A_BOLD; >> - CRT_colors[MEMORY_BUFFERS] = A_NORMAL; >> + CRT_colors[MEMORY_DIRTY] = A_NORMAL; >> CRT_colors[MEMORY_CACHE] = A_NORMAL; >> CRT_colors[LOAD_AVERAGE_FIFTEEN] = A_DIM; >> CRT_colors[LOAD_AVERAGE_FIVE] = A_NORMAL; >> @@ -342,7 +342,7 @@ void CRT_setColors(int colorScheme) { >> CRT_colors[GRAPH_8] = ColorPair(Yellow,White); >> CRT_colors[GRAPH_9] = ColorPair(Yellow,White); >> CRT_colors[MEMORY_USED] = ColorPair(Green,White); >> - CRT_colors[MEMORY_BUFFERS] = ColorPair(Cyan,White); >> + CRT_colors[MEMORY_DIRTY] = ColorPair(Cyan,White); >> CRT_colors[MEMORY_CACHE] = ColorPair(Yellow,White); >> CRT_colors[LOAD_AVERAGE_FIFTEEN] = ColorPair(Black,White); >> CRT_colors[LOAD_AVERAGE_FIVE] = ColorPair(Black,White); >> @@ -403,7 +403,7 @@ void CRT_setColors(int colorScheme) { >> CRT_colors[GRAPH_8] = ColorPair(Yellow,Black); >> CRT_colors[GRAPH_9] = ColorPair(Yellow,Black); >> CRT_colors[MEMORY_USED] = ColorPair(Green,Black); >> - CRT_colors[MEMORY_BUFFERS] = ColorPair(Cyan,Black); >> + CRT_colors[MEMORY_DIRTY] = ColorPair(Cyan,Black); >> CRT_colors[MEMORY_CACHE] = ColorPair(Yellow,Black); >> CRT_colors[LOAD_AVERAGE_FIFTEEN] = ColorPair(Black,Black); >> CRT_colors[LOAD_AVERAGE_FIVE] = ColorPair(Black,Black); >> @@ -464,7 +464,7 @@ void CRT_setColors(int colorScheme) { >> CRT_colors[GRAPH_8] = A_BOLD | ColorPair(Yellow,Blue); >> CRT_colors[GRAPH_9] = A_BOLD | ColorPair(Yellow,Blue); >> CRT_colors[MEMORY_USED] = A_BOLD | ColorPair(Green,Blue); >> - CRT_colors[MEMORY_BUFFERS] = A_BOLD | ColorPair(Cyan,Blue); >> + CRT_colors[MEMORY_DIRTY] = A_BOLD | ColorPair(Cyan,Blue); >> CRT_colors[MEMORY_CACHE] = A_BOLD | ColorPair(Yellow,Blue); >> CRT_colors[LOAD_AVERAGE_FIFTEEN] = A_BOLD | ColorPair(Black,Blue); >> CRT_colors[LOAD_AVERAGE_FIVE] = A_NORMAL | ColorPair(White,Blue); >> @@ -525,7 +525,7 @@ void CRT_setColors(int colorScheme) { >> CRT_colors[GRAPH_8] = ColorPair(Blue,Black); >> CRT_colors[GRAPH_9] = A_BOLD | ColorPair(Black,Black); >> CRT_colors[MEMORY_USED] = ColorPair(Green,Black); >> - CRT_colors[MEMORY_BUFFERS] = ColorPair(Blue,Black); >> + CRT_colors[MEMORY_DIRTY] = ColorPair(Blue,Black); >> CRT_colors[MEMORY_CACHE] = ColorPair(Yellow,Black); >> CRT_colors[LOAD_AVERAGE_FIFTEEN] = ColorPair(Green,Black); >> CRT_colors[LOAD_AVERAGE_FIVE] = ColorPair(Green,Black); >> @@ -587,7 +587,7 @@ void CRT_setColors(int colorScheme) { >> CRT_colors[GRAPH_8] = ColorPair(Blue,Black); >> CRT_colors[GRAPH_9] = A_BOLD | ColorPair(Black,Black); >> CRT_colors[MEMORY_USED] = ColorPair(Green,Black); >> - CRT_colors[MEMORY_BUFFERS] = ColorPair(Blue,Black); >> + CRT_colors[MEMORY_DIRTY] = ColorPair(Blue,Black); >> CRT_colors[MEMORY_CACHE] = ColorPair(Yellow,Black); >> CRT_colors[LOAD_AVERAGE_FIFTEEN] = A_BOLD | ColorPair(Black,Black); >> CRT_colors[LOAD_AVERAGE_FIVE] = A_NORMAL; >> diff --git a/CRT.h b/CRT.h >> index f7d4d72..22125e2 100644 >> --- a/CRT.h >> +++ b/CRT.h >> @@ -75,7 +75,7 @@ typedef enum ColorElements_ { >> GRAPH_8, >> GRAPH_9, >> MEMORY_USED, >> - MEMORY_BUFFERS, >> + MEMORY_DIRTY, >> MEMORY_CACHE, >> LOAD, >> LOAD_AVERAGE_FIFTEEN, >> diff --git a/MemoryMeter.c b/MemoryMeter.c >> index eca0442..0f59808 100644 >> --- a/MemoryMeter.c >> +++ b/MemoryMeter.c >> @@ -22,17 +22,18 @@ in the source distribution for its full text. >> }*/ >> >> int MemoryMeter_attributes[] = { >> - MEMORY_USED, MEMORY_BUFFERS, MEMORY_CACHE >> + MEMORY_USED, MEMORY_DIRTY, MEMORY_CACHE >> }; >> >> static void MemoryMeter_setValues(Meter* this, char* buffer, int size) { >> long int usedMem = this->pl->usedMem; >> - long int buffersMem = this->pl->buffersMem; >> - long int cachedMem = this->pl->cachedMem; >> - usedMem -= buffersMem + cachedMem; >> + long int dirtyMem = this->pl->dirtyMem + this->pl->writebackMem; >> + long int cachedMem = this->pl->buffersMem + this->pl->cachedMem; >> + usedMem -= cachedMem; >> + cachedMem -= dirtyMem; >> this->total = this->pl->totalMem; >> this->values[0] = usedMem; >> - this->values[1] = buffersMem; >> + this->values[1] = dirtyMem; >> this->values[2] = cachedMem; >> snprintf(buffer, size, "%ld/%ldMB", (long int) usedMem / 1024, (long >> int) this->total / 1024); >> } >> @@ -43,7 +44,7 @@ static void MemoryMeter_display(Object* cast, RichString* >> out) { >> int k = 1024; const char* format = "%ldM "; >> long int totalMem = this->total / k; >> long int usedMem = this->values[0] / k; >> - long int buffersMem = this->values[1] / k; >> + long int dirtyMem = this->values[1] / k; >> long int cachedMem = this->values[2] / k; >> RichString_write(out, CRT_colors[METER_TEXT], ":"); >> sprintf(buffer, format, totalMem); >> @@ -51,9 +52,9 @@ static void MemoryMeter_display(Object* cast, RichString* >> out) { >> sprintf(buffer, format, usedMem); >> RichString_append(out, CRT_colors[METER_TEXT], "used:"); >> RichString_append(out, CRT_colors[MEMORY_USED], buffer); >> - sprintf(buffer, format, buffersMem); >> - RichString_append(out, CRT_colors[METER_TEXT], "buffers:"); >> - RichString_append(out, CRT_colors[MEMORY_BUFFERS], buffer); >> + sprintf(buffer, format, dirtyMem); >> + RichString_append(out, CRT_colors[METER_TEXT], "dirty:"); >> + RichString_append(out, CRT_colors[MEMORY_DIRTY], buffer); >> sprintf(buffer, format, cachedMem); >> RichString_append(out, CRT_colors[METER_TEXT], "cache:"); >> RichString_append(out, CRT_colors[MEMORY_CACHE], buffer); >> diff --git a/ProcessList.c b/ProcessList.c >> index 99a6512..94a9a5e 100644 >> --- a/ProcessList.c >> +++ b/ProcessList.c >> @@ -127,6 +127,8 @@ typedef struct ProcessList_ { >> unsigned long long int sharedMem; >> unsigned long long int buffersMem; >> unsigned long long int cachedMem; >> + unsigned long long int dirtyMem; >> + unsigned long long int writebackMem; >> unsigned long long int totalSwap; >> unsigned long long int usedSwap; >> unsigned long long int freeSwap; >> @@ -788,6 +790,14 @@ void ProcessList_scan(ProcessList* this) { >> if (String_startsWith(buffer, "Cached:")) >> sscanf(buffer, "Cached: %llu kB", &this->cachedMem); >> break; >> + case 'D': >> + if (String_startsWith(buffer, "Dirty:")) >> + sscanf(buffer, "Dirty: %llu kB", &this->dirtyMem); >> + break; >> + case 'W': >> + if (String_startsWith(buffer, "Writeback:")) >> + sscanf(buffer, "Writeback: %llu kB", &this->writebackMem); >> + break; >> case 'S': >> if (String_startsWith(buffer, "SwapTotal:")) >> sscanf(buffer, "SwapTotal: %llu kB", &this->totalSwap); >> diff --git a/ProcessList.h b/ProcessList.h >> index e410ae2..cdc4c4e 100644 >> --- a/ProcessList.h >> +++ b/ProcessList.h >> @@ -110,6 +110,8 @@ typedef struct ProcessList_ { >> unsigned long long int sharedMem; >> unsigned long long int buffersMem; >> unsigned long long int cachedMem; >> + unsigned long long int dirtyMem; >> + unsigned long long int writebackMem; >> unsigned long long int totalSwap; >> unsigned long long int usedSwap; >> unsigned long long int freeSwap; >> diff --git a/htop.c b/htop.c >> index cdee8ee..220aa8e 100644 >> --- a/htop.c >> +++ b/htop.c >> @@ -102,7 +102,7 @@ static void showHelp(ProcessList* pl) { >> mvaddstr(4, 0, "Memory bar: "); >> addattrstr(CRT_colors[BAR_BORDER], "["); >> addattrstr(CRT_colors[MEMORY_USED], "used"); addstr("/"); >> - addattrstr(CRT_colors[MEMORY_BUFFERS], "buffers"); addstr("/"); >> + addattrstr(CRT_colors[MEMORY_DIRTY], "dirty"); addstr("/"); >> addattrstr(CRT_colors[MEMORY_CACHE], "cache"); >> addattrstr(CRT_colors[BAR_SHADOW], " >> used/total"); >> addattrstr(CRT_colors[BAR_BORDER], "]"); >> -- 1.7.2.5 > > > ------------------------------------------------------------------------------ > Everyone hates slow websites. So do we. > Make your web apps faster with AppDynamics > Download AppDynamics Lite for free today: > http://p.sf.net/sfu/appdyn_d2d_jan > _______________________________________________ > htop-general mailing list > [email protected] > https://lists.sourceforge.net/lists/listinfo/htop-general ------------------------------------------------------------------------------ Everyone hates slow websites. So do we. Make your web apps faster with AppDynamics Download AppDynamics Lite for free today: http://p.sf.net/sfu/appdyn_d2d_jan _______________________________________________ htop-general mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/htop-general
