<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>hudson@work &#187; awk</title>
	<atom:link href="http://hudson.su/tag/awk/feed/" rel="self" type="application/rss+xml" />
	<link>http://hudson.su</link>
	<description>статьи о web-разработке, менеджменте IT проектов и контроле качества</description>
	<lastBuildDate>Fri, 20 Jan 2012 13:15:39 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	
		<item>
		<title>Скрипт просмотра объема памяти, потребляемого процессами в linux</title>
		<link>http://hudson.su/2010/01/22/script-memory-usage-in-linux/</link>
		<comments>http://hudson.su/2010/01/22/script-memory-usage-in-linux/#comments</comments>
		<pubDate>Fri, 22 Jan 2010 15:54:05 +0000</pubDate>
		<dc:creator>hudson</dc:creator>
				<category><![CDATA[Профессиональное]]></category>
		<category><![CDATA[awk]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[howto]]></category>
		<category><![CDATA[linux]]></category>

		<guid isPermaLink="false">http://hudson.su/?p=771</guid>
		<description><![CDATA[Часто возникает необходимость посмотреть суммарное потребление памяти группой однотипных процессов (кумулятивно). top и ps без обработки не сильно помогает, поэтому сегодня написал следующий скрипт: Собственно скрипт #!/bin/bash ps -eo pid,comm,user,%mem &#124; awk ' { memory[$2]+=$4; } END { print( "--== Cumulative memory usage TOP: ==--" ); print( "--------------------------------------" ); print( "%MEM t&#124; COMM" ); print( [...]]]></description>
			<content:encoded><![CDATA[<p>Часто возникает необходимость посмотреть суммарное потребление памяти группой однотипных процессов (кумулятивно). top и ps без обработки не сильно помогает, поэтому сегодня написал следующий скрипт:</p>
<p><span id="more-771"></span></p>
<p>Собственно скрипт</p>
<pre>#!/bin/bash
ps -eo pid,comm,user,%mem | awk '
{
    memory[$2]+=$4;
}
END
{
    print( "--== Cumulative memory usage TOP: ==--" );
    print( "--------------------------------------" );
    print( "%MEM t| COMM" );
    print( "--------------------------------------" );
    while( length(memory) &gt; 0 )
    {
        max = -1;
        for( i in memory )
        {
            if( memory[i]&gt;max )
            {
                max_index = i;
                max = memory[max_index];
            }
        }
        delete memory[max_index];
        print( max, "t| ", max_index  );
    }
}' | less
</pre>
<p>Несколько комментариев:</p>
<ul>
<li>Сначала получаем список процессов при помощи <strong>ps</strong>. Выглядит он примерно так:</li>
</ul>
<pre>  PID COMMAND         USER     %MEM
    1 init            root      0.0
    2 migration/0     root      0.0
    3 ksoftirqd/0     root      0.0
    4 watchdog/0      root      0.0
    5 migration/1     root      0.0
    6 ksoftirqd/1     root      0.0
</pre>
<ul>
<li>Затем при помощи <strong>awk </strong>собираем кумулятивные данные в массив ( <em>memory[$2]+=$4;</em> ). Тут думаю все понятно.</li>
<li>Последним штрихом является сортировка кумулятивных значений и их отображение. К сожалению <strong>asort</strong>, встроенный в <strong>gawk</strong>,<strong> </strong>выдавал что-то неудобоваримое, пришлось написать простую сортировку самостоятельно. Пока массив memory содержит элементы, пробегаем мессив memory, ищем максимальный элемент, печатаем его, удаляем максимальный элемент ( <em>delete memory[max_index];</em> ). Каждую итерацию, массив memory уменьшается на один элемент.</li>
<li>less добавлен для удобства использования.</li>
</ul>
<p>Результат работы скрипта:</p>
<pre>--== Cumulative memory usage TOP: ==--
--------------------------------------
%MEM    | COMM
--------------------------------------
7.4     |  httpd
3.1     |  clamd
2.8     |  spamd
0.6     |  mysqld
0.4     |  yum-updatesd
0.2     |  named
0.1     |  ntpd
0.1     |  munin-node
0       |  rpciod/1
0       |  rpciod/2
0       |  udevd
</pre>
<p>Боле короткая форма записи для скрипта (без сортировки, но в одну строку):</p>
<pre>
#
ps -eo pid,comm,user,%mem | awk '{memory[$2]+=$4} END{ print( "%MEM t| COMM" ); for( proc in memory ) print( memory[proc], "t| ", proc  ); }' | less
</pre>
<p>Have fun ))</p>
<p>p.s. Можно добавить еще распознавание и группировку таких процессов rpciod/1 и rpciod/2<br />
p.p.s. Можно попробовать добавить обновление по времени like top, и ограничить число выводимых процессов (например 20ю).</p>
]]></content:encoded>
			<wfw:commentRss>http://hudson.su/2010/01/22/script-memory-usage-in-linux/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

