<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
	<id>http://blaireaulinux.fr//wiki/index.php?action=history&amp;feed=atom&amp;title=Solaris_-_Consommation_de_ressources</id>
	<title>Solaris - Consommation de ressources - Historique des versions</title>
	<link rel="self" type="application/atom+xml" href="http://blaireaulinux.fr//wiki/index.php?action=history&amp;feed=atom&amp;title=Solaris_-_Consommation_de_ressources"/>
	<link rel="alternate" type="text/html" href="http://blaireaulinux.fr//wiki/index.php?title=Solaris_-_Consommation_de_ressources&amp;action=history"/>
	<updated>2026-05-28T05:34:47Z</updated>
	<subtitle>Historique des révisions pour cette page sur le wiki</subtitle>
	<generator>MediaWiki 1.37.0</generator>
	<entry>
		<id>http://blaireaulinux.fr//wiki/index.php?title=Solaris_-_Consommation_de_ressources&amp;diff=523&amp;oldid=prev</id>
		<title>AdminWiki : /* Classer les processus par consommation d&#039;I/O disque */</title>
		<link rel="alternate" type="text/html" href="http://blaireaulinux.fr//wiki/index.php?title=Solaris_-_Consommation_de_ressources&amp;diff=523&amp;oldid=prev"/>
		<updated>2015-11-05T10:54:32Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Classer les processus par consommation d&amp;#039;I/O disque&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;a href=&quot;http://blaireaulinux.fr//wiki/index.php?title=Solaris_-_Consommation_de_ressources&amp;amp;diff=523&amp;amp;oldid=522&quot;&gt;Voir les modifications&lt;/a&gt;</summary>
		<author><name>AdminWiki</name></author>
	</entry>
	<entry>
		<id>http://blaireaulinux.fr//wiki/index.php?title=Solaris_-_Consommation_de_ressources&amp;diff=522&amp;oldid=prev</id>
		<title>AdminWiki : Page créée avec « Category:Solaris  ==Surveillance disques==  ===Surveiller utilisation des I/O disques===   # iostat -xn 2 2                      extended device statistics      r/s... »</title>
		<link rel="alternate" type="text/html" href="http://blaireaulinux.fr//wiki/index.php?title=Solaris_-_Consommation_de_ressources&amp;diff=522&amp;oldid=prev"/>
		<updated>2015-11-05T10:50:00Z</updated>

		<summary type="html">&lt;p&gt;Page créée avec « &lt;a href=&quot;/wiki/index.php?title=Cat%C3%A9gorie:Solaris&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;Catégorie:Solaris (page inexistante)&quot;&gt;Category:Solaris&lt;/a&gt;  ==Surveillance disques==  ===Surveiller utilisation des I/O disques===   # iostat -xn 2 2                      extended device statistics      r/s... »&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nouvelle page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;[[Category:Solaris]]&lt;br /&gt;
&lt;br /&gt;
==Surveillance disques==&lt;br /&gt;
&lt;br /&gt;
===Surveiller utilisation des I/O disques===&lt;br /&gt;
&lt;br /&gt;
 # iostat -xn 2 2&lt;br /&gt;
                     extended device statistics&lt;br /&gt;
     r/s    w/s   kr/s   kw/s wait actv wsvc_t asvc_t  %w  %b device&lt;br /&gt;
     0.1    3.1    9.1   23.5  0.0  0.0    0.0    3.0   0   0 c0d0&lt;br /&gt;
    34.1    0.0   17.1    0.0  0.0  0.6    0.0   16.9   0   3 c0d1&lt;br /&gt;
    34.4    0.0   17.2    0.0  0.0  0.6    0.0   16.6   0   3 c0d2&lt;br /&gt;
    [...]&lt;br /&gt;
   111.7   56.6 1599.6  990.2  0.0  4.7    0.0   27.8   0  97 vdc34&lt;br /&gt;
     0.0    0.0    0.0    0.0  0.0  0.0    0.0    0.0   0   0 vdc35&lt;br /&gt;
     0.0    0.0    0.0    0.0  0.0  0.0    0.0    0.0   0   0 vdc36&lt;br /&gt;
    [...]&lt;br /&gt;
&lt;br /&gt;
Les colonnes intéressantes sont &amp;quot;%w&amp;quot; et &amp;quot;%b&amp;quot;. &amp;quot;%b&amp;quot; indique le pourcentage d&amp;#039;utilisation du disque (ou de la LUN sur SAN). Ici on voit que le disque vdc34 est utilisé à 97%. Sur ce système, où je n&amp;#039;ai affiché ici que quelques LUNs, de nombreuses LUNs sont utilisées à 100% ou presque et nous ressentons de gros ralentissements. L&amp;#039;activité est trop forte et la baie n&amp;#039;est pas assez performante.&lt;br /&gt;
&lt;br /&gt;
La colonne &amp;quot;%w&amp;quot; indique le pourcentage d&amp;#039;attente pour écrire sur le disque, donc concrètement, si &amp;quot;%w&amp;quot; est supérieur à &amp;quot;%b&amp;quot;, c&amp;#039;est que la latence n&amp;#039;est pas sur le disque, mais sur le bus système.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Classer les processus par consommation d&amp;#039;I/O disque===&lt;br /&gt;
&lt;br /&gt;
Je n&amp;#039;ai pas trouvé de commande claire pour retourner cette info, mais j&amp;#039;ai trouvé un script perl &amp;quot;rusage&amp;quot; sur le net ici [http://www.brendangregg.com/Solaris/prusage]. Et un pdf de 45 pages traite en détail de ce sujet ici : [http://www.brendangregg.com/Solaris/paper_diskubyp1.pdf].&lt;br /&gt;
&lt;br /&gt;
Voici un exemple d&amp;#039;utilisation et juste après le code source, au cas où le lien ne serait plus accessible. Ici on classe les processus par consommation disque en écriture.&lt;br /&gt;
&lt;br /&gt;
 # ./prusage -i 2 2 -s pid&lt;br /&gt;
    PID  MINF  MAJF    INBLK    OUBLK   CHAR-kb COMM&lt;br /&gt;
  18085     0 1034624       11  2066703    783785 oracle&lt;br /&gt;
  18072     0 1004673       28  2006007   2922472 oracle&lt;br /&gt;
  14414     0  1517      316   926171    525708 tictimed&lt;br /&gt;
  11107     0  6626       13   777992   1193227 lp&lt;br /&gt;
  15910     0  1527      137   710801    633187 tictimed&lt;br /&gt;
  13808     0   964       93   707699    633186 tictimed&lt;br /&gt;
  14415     0  1188       68   695021    633219 tictimed&lt;br /&gt;
  14484     0  2700       69   694253    633180 tictimed&lt;br /&gt;
  13647     0  2211      143   687310    633193 tictimed&lt;br /&gt;
  15098     0  1186       92   674124    633187 tictimed&lt;br /&gt;
  13812     0  1268      172   673283    633219 tictimed&lt;br /&gt;
  13898     0  1042       49   673332    633200 tictimed&lt;br /&gt;
  12612     0   945       79   671873    633160 tictimed&lt;br /&gt;
&lt;br /&gt;
Et le code source :&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/perl&lt;br /&gt;
 #&lt;br /&gt;
 # prusage - Process usage stats, Solaris. I/O, sys/usr times, context switches.&lt;br /&gt;
 #           A supplement to &amp;quot;ps&amp;quot;, can be run as any user.&lt;br /&gt;
 #&lt;br /&gt;
 # 01-Jul-2005, ver 1.00  (check for newer vers, http://www.brendangregg.com)&lt;br /&gt;
 #&lt;br /&gt;
 #&lt;br /&gt;
 # USAGE: prusage [-bchinuwxCT] [-p PID] [-s sort] [-t top] [interval] [count]&lt;br /&gt;
 #&lt;br /&gt;
 #      prusage               # Default. (-ic 1), fit to screen, 1 secs.&lt;br /&gt;
 #      prusage -b            # Child times report (must be root or owner)&lt;br /&gt;
 #      prusage -i            # I/O stats (default)&lt;br /&gt;
 #      prusage -u            # USR/SYS times&lt;br /&gt;
 #      prusage -x            # Context Switchs&lt;br /&gt;
 #      prusage -w            # Wide output&lt;br /&gt;
 #      prusage -c            # Clear the screen (default)&lt;br /&gt;
 #      prusage -C            # Don&amp;#039;t clear the screen&lt;br /&gt;
 #      prusage -T            # Don&amp;#039;t fit to screen (print all lines)&lt;br /&gt;
 #      prusage -p pid        # Print this PID only&lt;br /&gt;
 #      prusage -s sort       # Sort on pid,blks,cpu,utime,inblk,vctx,...&lt;br /&gt;
 #      prusage -t lines      # Print top lines only&lt;br /&gt;
 #  eg,&lt;br /&gt;
 #      prusage 2             # 2 second samples (first is historical)&lt;br /&gt;
 #      prusage 2 5           # 5 x 2 second samples&lt;br /&gt;
 #      prusage -xi 2         # I/O and Context switch reports, 2 secs&lt;br /&gt;
 #      prusage -biux 10      # multi output, all reports every 10 secs&lt;br /&gt;
 #      prusage -C 10         # 10 second samples, no clear screen&lt;br /&gt;
 #      prusage -CT 10        # 10 second samples, all lines&lt;br /&gt;
 #      prusage -Ct8 10 5     # 5 x 10 second samples, top 8 lines only&lt;br /&gt;
 #      prusage -p 11321      # PID 11321 only&lt;br /&gt;
 #      prusage -s pid        # sort on PID&lt;br /&gt;
 #&lt;br /&gt;
 # FIELDS:&lt;br /&gt;
 #              PID     Process ID&lt;br /&gt;
 #              MINF    Minor Page Faults (satisfied from RAM)&lt;br /&gt;
 #              MAJF    Major Page Faults (satisfied by disk I/O)&lt;br /&gt;
 #              INBLK   In Blocks (disk I/O reads)&lt;br /&gt;
 #              OUBLK   Out Blocks (disk I/O writes)&lt;br /&gt;
 #              CHAR-kb Character I/O Kbytes&lt;br /&gt;
 #              COMM    Command name&lt;br /&gt;
 #              USR     User Time&lt;br /&gt;
 #              SYS     System Time&lt;br /&gt;
 #              CUSR    Child User Time&lt;br /&gt;
 #              CSYS    Child System Time&lt;br /&gt;
 #              WAIT    Wait for CPU Time&lt;br /&gt;
 #              LOCK    User waiting on lock time&lt;br /&gt;
 #              TRAP    System trap time&lt;br /&gt;
 #              VCTX    Voluntary Context Switches (I/O bound)&lt;br /&gt;
 #              ICTX    Involuntary Context Switches (CPU bound)&lt;br /&gt;
 #              SYSC    System calls&lt;br /&gt;
 #&lt;br /&gt;
 # NOTE: Minor faults always report zero on most versions of Solaris.&lt;br /&gt;
 #&lt;br /&gt;
 # REFERENCE: /usr/include/sys/procfs.h&lt;br /&gt;
 #&lt;br /&gt;
 # SEE ALSO: psio                               # process I/O&lt;br /&gt;
 #          prstat -m                           # USR/SYS times, ...&lt;br /&gt;
 #           /usr/ucb/rusage                    # historical&lt;br /&gt;
 #&lt;br /&gt;
 # COPYRIGHT: Copyright (c) 2004, 2005 Brendan Gregg.&lt;br /&gt;
 #&lt;br /&gt;
 #  This program is free software; you can redistribute it and/or&lt;br /&gt;
 #  modify it under the terms of the GNU General Public License&lt;br /&gt;
 #  as published by the Free Software Foundation; either version 2&lt;br /&gt;
 #  of the License, or (at your option) any later version.&lt;br /&gt;
 #&lt;br /&gt;
 #  This program is distributed in the hope that it will be useful,&lt;br /&gt;
 #  but WITHOUT ANY WARRANTY; without even the implied warranty of&lt;br /&gt;
 #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the&lt;br /&gt;
 #  GNU General Public License for more details.&lt;br /&gt;
 #&lt;br /&gt;
 #  You should have received a copy of the GNU General Public License&lt;br /&gt;
 #  along with this program; if not, write to the Free Software Foundation,&lt;br /&gt;
 #  Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.&lt;br /&gt;
 #&lt;br /&gt;
 #  (http://www.gnu.org/copyleft/gpl.html)&lt;br /&gt;
 #&lt;br /&gt;
 # Author: Brendan Gregg  [Sydney, Australia]&lt;br /&gt;
 #&lt;br /&gt;
 # 31-Aug-2004  Brendan Gregg   Created this.&lt;br /&gt;
 # 12-Mar-2005     &amp;quot;      &amp;quot;     Processed /proc/*/psinfo as well.&lt;br /&gt;
 # 09-May-2005     &amp;quot;      &amp;quot;     Processed /proc/*/usage as well.&lt;br /&gt;
&lt;br /&gt;
 use Getopt::Std;&lt;br /&gt;
&lt;br /&gt;
 #&lt;br /&gt;
 # --- Default Variables ---&lt;br /&gt;
 #&lt;br /&gt;
 $INTERVAL = 1;         # seconds to sample&lt;br /&gt;
 $MAX = 2**32;          # max count of samples&lt;br /&gt;
 $NEW = 0;              # skip summary output (new data only)&lt;br /&gt;
 $WIDE = 0;             # print wide output (don&amp;#039;t truncate)&lt;br /&gt;
 $SCHED = 0;            # print PID 0&lt;br /&gt;
 $TOP = 0;              # print top many only&lt;br /&gt;
 $FIT = 1;              # fit to screen&lt;br /&gt;
 $CLEAR = 1;            # clear screen before outputs&lt;br /&gt;
 $STYLE_IO = 1;         # default output style, I/O&lt;br /&gt;
 $STYLE_CTX = 0;                # output style, Context Switches&lt;br /&gt;
 $STYLE_TIME = 0;       # output style, Times&lt;br /&gt;
 $STYLE_CHILD = 0;      # output style, Child times&lt;br /&gt;
 $MULTI = 0;            # multi reports, multiple styles&lt;br /&gt;
 $TARGET_PID = -1;      # target PID, -1 means all&lt;br /&gt;
 $count = 1;            # current iteration&lt;br /&gt;
&lt;br /&gt;
 #&lt;br /&gt;
 # --- Command Line Arguments ---&lt;br /&gt;
 #&lt;br /&gt;
&lt;br /&gt;
 ### Check usage&lt;br /&gt;
 &amp;amp;Usage() if $ARGV[0] eq &amp;quot;--help&amp;quot;;&lt;br /&gt;
 getopts(&amp;#039;bchinuwxp:s:t:CT&amp;#039;) || &amp;amp;Usage();&lt;br /&gt;
 &amp;amp;Usage() if $opt_h;&lt;br /&gt;
&lt;br /&gt;
 ### Process options&lt;br /&gt;
 $NEW = 1 if $opt_n;&lt;br /&gt;
 $WIDE = 1 if $opt_w;&lt;br /&gt;
 $FIT = 0 if $opt_T;&lt;br /&gt;
 $CLEAR = 0 if $opt_C;&lt;br /&gt;
 $STYLE_IO = 0 if $opt_x || $opt_u || $opt_b;&lt;br /&gt;
 $STYLE_CTX = 1 if $opt_x;&lt;br /&gt;
 $STYLE_TIME = 1 if $opt_u;&lt;br /&gt;
 $STYLE_CHILD = 1 if $opt_b;&lt;br /&gt;
 $STYLE_IO = 1 if $opt_i;&lt;br /&gt;
 $TOP = $opt_t if defined $opt_t;&lt;br /&gt;
 $SORT = $opt_s if defined $opt_s;&lt;br /&gt;
 $TARGET_PID = $opt_p if defined $opt_p;&lt;br /&gt;
 $INTERVAL = shift(@ARGV) || $INTERVAL;&lt;br /&gt;
 $MAX = shift(@ARGV) || $MAX;&lt;br /&gt;
&lt;br /&gt;
 ### Determine style count&lt;br /&gt;
 $STYLES = $STYLE_IO + $STYLE_CTX + $STYLE_TIME + $STYLE_CHILD;&lt;br /&gt;
 $MULTI = 1 if $STYLES &amp;gt; 1;&lt;br /&gt;
&lt;br /&gt;
 ### Determine clear seq&lt;br /&gt;
 $CLEARSTR = `clear` if $CLEAR;&lt;br /&gt;
&lt;br /&gt;
 ### Fit to screen&lt;br /&gt;
 if ($FIT &amp;amp;&amp;amp; ! $opt_t) {&lt;br /&gt;
        my ($row,$col) = &amp;amp;getwinsz();&lt;br /&gt;
        $TOP = int(($row - $STYLES * 2) / $STYLES);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 #&lt;br /&gt;
 # --- Main ---&lt;br /&gt;
 #&lt;br /&gt;
 for (;$count &amp;lt;= $MAX; $count++) {&lt;br /&gt;
&lt;br /&gt;
        ### Get data&lt;br /&gt;
        &amp;amp;GetProcStat();         # fetch and save /proc stats in %PID{$pid}&lt;br /&gt;
&lt;br /&gt;
        next if $NEW &amp;amp;&amp;amp; $count == 1;&lt;br /&gt;
&lt;br /&gt;
        ### Print data&lt;br /&gt;
        print $CLEARSTR if $CLEAR;&lt;br /&gt;
        &amp;amp;PrintIO($SORT) if $STYLE_IO;&lt;br /&gt;
        &amp;amp;PrintCtx($SORT) if $STYLE_CTX;&lt;br /&gt;
        &amp;amp;PrintTime($SORT) if $STYLE_TIME;&lt;br /&gt;
        &amp;amp;PrintChild($SORT) if $STYLE_CHILD;&lt;br /&gt;
&lt;br /&gt;
        ### Pause&lt;br /&gt;
        sleep($INTERVAL) unless $count == $MAX;&lt;br /&gt;
&lt;br /&gt;
        ### Cleanup memory&lt;br /&gt;
        undef %PID;&lt;br /&gt;
        undef %Comm;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 #&lt;br /&gt;
 # --- Subroutines ---&lt;br /&gt;
 #&lt;br /&gt;
&lt;br /&gt;
 # GetProcStat - Gets /proc usage statistics and saves them in %PID.&lt;br /&gt;
 #      This can be run multiple times, the first time %PID will be&lt;br /&gt;
 #      populated with the summary since boot values.&lt;br /&gt;
 #      This reads /proc/*/usage and /proc/*/psinfo.&lt;br /&gt;
 #&lt;br /&gt;
 sub GetProcStat {&lt;br /&gt;
    my $pid;&lt;br /&gt;
    chdir &amp;quot;/proc&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    foreach $pid (sort {$a&amp;lt;=&amp;gt;$b} &amp;lt;*&amp;gt;) {&lt;br /&gt;
        next if $pid == $$;&lt;br /&gt;
        next if $pid == 0 &amp;amp;&amp;amp; $SCHED == 0;&lt;br /&gt;
        next if $TARGET_PID &amp;gt; -1 &amp;amp;&amp;amp; $pid != $TARGET_PID;&lt;br /&gt;
&lt;br /&gt;
        #&lt;br /&gt;
        #  struct prusage&lt;br /&gt;
        #&lt;br /&gt;
&lt;br /&gt;
        ### Read usage stats&lt;br /&gt;
        open(USAGE,&amp;quot;/proc/$pid/usage&amp;quot;) || next;&lt;br /&gt;
        read(USAGE,$usage,256);&lt;br /&gt;
        close USAGE;&lt;br /&gt;
&lt;br /&gt;
        ### Unpack usage values&lt;br /&gt;
        ($pr_lwpid, $pr_count, $pr_tstamp, $pr_create, $pr_term,&lt;br /&gt;
         $pr_rtime, $pr_utime, $pr_stime, $pr_ttime, $pr_tftime,&lt;br /&gt;
         $pr_dftime, $pr_kftime, $pr_ltime, $pr_slptime, $pr_wtime,&lt;br /&gt;
         $pr_stoptime, $filltime, $pr_minf, $pr_majf, $pr_nswap,&lt;br /&gt;
         $pr_inblk, $pr_oublk, $pr_msnd, $pr_mrcv, $pr_sigs,&lt;br /&gt;
         $pr_vctx, $pr_ictx, $pr_sysc, $pr_ioch, $filler) =&lt;br /&gt;
         unpack(&amp;quot;iia8a8a8a8a8a8a8a8a8a8a8a8a8a8a48LLLLLLLLLLLLa40&amp;quot;,$usage);&lt;br /&gt;
&lt;br /&gt;
        ### Process usage values&lt;br /&gt;
        $New{$pid}{utime} = timestruct2int($pr_utime);&lt;br /&gt;
        $New{$pid}{stime} = timestruct2int($pr_stime);&lt;br /&gt;
        $New{$pid}{ttime} = timestruct2int($pr_ttime);&lt;br /&gt;
        $New{$pid}{ltime} = timestruct2int($pr_ltime);&lt;br /&gt;
        $New{$pid}{wtime} = timestruct2int($pr_wtime);&lt;br /&gt;
        $New{$pid}{slptime} = timestruct2int($pr_slptime);&lt;br /&gt;
        $New{$pid}{minf}  = $pr_minf;&lt;br /&gt;
        $New{$pid}{majf}  = $pr_majf;&lt;br /&gt;
        $New{$pid}{nswap} = $pr_nswap;&lt;br /&gt;
        $New{$pid}{inblk} = $pr_inblk;&lt;br /&gt;
        $New{$pid}{oublk} = $pr_oublk;&lt;br /&gt;
        $New{$pid}{vctx}  = $pr_vctx;&lt;br /&gt;
        $New{$pid}{ictx}  = $pr_ictx;&lt;br /&gt;
        $New{$pid}{sysc}  = $pr_sysc;&lt;br /&gt;
        $New{$pid}{ioch}  = $pr_ioch;&lt;br /&gt;
        # and a couple of my own,&lt;br /&gt;
        $New{$pid}{blks}  = $pr_inblk + $pr_oublk;&lt;br /&gt;
        $New{$pid}{ctxs}  = $pr_vctx + $pr_ictx;&lt;br /&gt;
        $New{$pid}{cpu}  = $New{$pid}{utime} + $New{$pid}{stime};&lt;br /&gt;
&lt;br /&gt;
        #&lt;br /&gt;
        #  struct psinfo&lt;br /&gt;
        #&lt;br /&gt;
&lt;br /&gt;
        ### Read psinfo stats&lt;br /&gt;
        open(PSINFO,&amp;quot;/proc/$pid/psinfo&amp;quot;) || next;&lt;br /&gt;
        read(PSINFO,$psinfo,256);&lt;br /&gt;
        close PSINFO;&lt;br /&gt;
&lt;br /&gt;
        ### Unpack psinfo values&lt;br /&gt;
        ($pr_flag, $pr_nlwp, $pr_pid, $pr_ppid, $pr_pgid, $pr_sid,&lt;br /&gt;
         $pr_uid, $pr_euid, $pr_gid, $pr_egid, $pr_addr, $pr_size,&lt;br /&gt;
         $pr_rssize, $pr_pad1, $pr_ttydev, $pr_pctcpu, $pr_pctmem,&lt;br /&gt;
         $pr_start, $pr_time, $pr_ctime, $pr_fname, $pr_psargs,&lt;br /&gt;
         $pr_wstat, $pr_argc, $pr_argv, $pr_envp, $pr_dmodel,&lt;br /&gt;
         $pr_taskid, $pr_projid, $pr_nzomb, $filler) =&lt;br /&gt;
         unpack(&amp;quot;iiiiiiiiiiIiiiiSSa8a8a8Z16Z80iiIIaa3iiia&amp;quot;,$psinfo);&lt;br /&gt;
&lt;br /&gt;
         ### Save command name&lt;br /&gt;
         $Comm{$pid} = $pr_fname;&lt;br /&gt;
&lt;br /&gt;
        next unless $STYLE_CHILD;       # only child needs the following,&lt;br /&gt;
&lt;br /&gt;
        #&lt;br /&gt;
        #  struct pstatus&lt;br /&gt;
        #&lt;br /&gt;
&lt;br /&gt;
        ### Read pstatus stats&lt;br /&gt;
        open(PSTATUS,&amp;quot;/proc/$pid/status&amp;quot;) || next;&lt;br /&gt;
        read(PSTATUS,$pstatus,128);&lt;br /&gt;
        close PSTATUS;&lt;br /&gt;
&lt;br /&gt;
        ### Unpack pstatus values&lt;br /&gt;
        ($pr_flags, $pr_nlwp, $pr_pid, $pr_ppid, $pr_pgid, $pr_sid,&lt;br /&gt;
         $pr_aslwpid, $pr_agentid, $pr_sigpend, $pr_brkbase, $pr_brksize,&lt;br /&gt;
         $pr_stkbase, $pr_stksize, $pr_utime, $pr_stime, $pr_cutime,&lt;br /&gt;
         $pr_cstime, $filler) =&lt;br /&gt;
         unpack(&amp;quot;iiiiiiiia16iiiia8a8a8a8a&amp;quot;,$pstatus);&lt;br /&gt;
&lt;br /&gt;
        ### Process pstatus values&lt;br /&gt;
        $New{$pid}{cutime} = timestruct2int($pr_cutime);&lt;br /&gt;
        $New{$pid}{cstime} = timestruct2int($pr_cstime);&lt;br /&gt;
        $New{$pid}{ccpu}  = $New{$pid}{cutime} + $New{$pid}{cstime};&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    ### Cleanup memory&lt;br /&gt;
    foreach $pid (keys %New) {&lt;br /&gt;
        # save PID values,&lt;br /&gt;
        foreach $key (keys %{$New{$pid}}) {&lt;br /&gt;
                $PID{$pid}{$key} = $New{$pid}{$key} - $Old{$pid}{$key};&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    undef %Old;&lt;br /&gt;
    foreach $pid (keys %New) {&lt;br /&gt;
        # save old values,&lt;br /&gt;
        foreach $key (keys %{$New{$pid}}) {&lt;br /&gt;
                $Old{$pid}{$key} = $New{$pid}{$key};&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 # PrintIO - print a report on I/O statistics: minf, majf, inblk, oublk, ioch.&lt;br /&gt;
 #&lt;br /&gt;
 sub PrintIO {&lt;br /&gt;
        my $sort = shift || &amp;quot;blks&amp;quot;;&lt;br /&gt;
        my $top = $TOP;&lt;br /&gt;
        my $pid;&lt;br /&gt;
&lt;br /&gt;
        ### Print header&lt;br /&gt;
        printf(&amp;quot;%6s %5s %5s %8s %8s %9s %s\n&amp;quot;,&amp;quot;PID&amp;quot;,&lt;br /&gt;
         &amp;quot;MINF&amp;quot;,&amp;quot;MAJF&amp;quot;,&amp;quot;INBLK&amp;quot;,&amp;quot;OUBLK&amp;quot;,&amp;quot;CHAR-kb&amp;quot;,&amp;quot;COMM&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        ### Print report&lt;br /&gt;
        foreach $pid (&amp;amp;SortPID(&amp;quot;$sort&amp;quot;)) {&lt;br /&gt;
                printf(&amp;quot;%6s %5s %5s %8s %8s %9.0f %s\n&amp;quot;,$pid,&lt;br /&gt;
                 $PID{$pid}{minf},$PID{$pid}{majf},$PID{$pid}{inblk},&lt;br /&gt;
                 $PID{$pid}{oublk},$PID{$pid}{ioch}/1024,&lt;br /&gt;
                 trunc($Comm{$pid},33));&lt;br /&gt;
                last if --$top == 0;&lt;br /&gt;
        }&lt;br /&gt;
        print &amp;quot;\n&amp;quot; if $MULTI;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 # PrintTime - print a report on Times: utime, stime, wtime, ltime, ttime.&lt;br /&gt;
 #&lt;br /&gt;
 sub PrintTime {&lt;br /&gt;
        my $sort = shift || &amp;quot;cpu&amp;quot;;&lt;br /&gt;
        my $top = $TOP;&lt;br /&gt;
        my $pid;&lt;br /&gt;
&lt;br /&gt;
        ### Print header&lt;br /&gt;
        printf(&amp;quot;%6s %8s %8s %8s %6s %6s %s\n&amp;quot;,&amp;quot;PID&amp;quot;,&lt;br /&gt;
         &amp;quot;USR&amp;quot;,&amp;quot;SYS&amp;quot;,&amp;quot;WAIT&amp;quot;,&amp;quot;LOCK&amp;quot;,&amp;quot;TRAP&amp;quot;,&amp;quot;COMM&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        ### Print report&lt;br /&gt;
        foreach $pid (&amp;amp;SortPID(&amp;quot;$sort&amp;quot;)) {&lt;br /&gt;
                printf(&amp;quot;%6s %8.2f %8.2f %8.2f %6.2f %6.2f %s\n&amp;quot;,$pid,&lt;br /&gt;
                 $PID{$pid}{utime},$PID{$pid}{stime},$PID{$pid}{wtime},&lt;br /&gt;
                 $PID{$pid}{ltime},$PID{$pid}{ttime},trunc($Comm{$pid},32));&lt;br /&gt;
                last if --$top == 0;&lt;br /&gt;
        }&lt;br /&gt;
        print &amp;quot;\n&amp;quot; if $MULTI;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 # PrintCtx - print a report on Context Swithes: utime, stime, vctx, ictx, sysc.&lt;br /&gt;
 #&lt;br /&gt;
 sub PrintCtx {&lt;br /&gt;
        my $sort = shift || &amp;quot;ctxs&amp;quot;;&lt;br /&gt;
        my $top = $TOP;&lt;br /&gt;
        my $pid;&lt;br /&gt;
&lt;br /&gt;
        ### Print header&lt;br /&gt;
        printf(&amp;quot;%6s %7s %7s %9s %8s %10s %s\n&amp;quot;,&amp;quot;PID&amp;quot;,&lt;br /&gt;
         &amp;quot;USR&amp;quot;,&amp;quot;SYS&amp;quot;,&amp;quot;VCTX&amp;quot;,&amp;quot;ICTX&amp;quot;,&amp;quot;SYSC&amp;quot;,&amp;quot;COMM&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        ### Print report&lt;br /&gt;
        foreach $pid (&amp;amp;SortPID(&amp;quot;$sort&amp;quot;)) {&lt;br /&gt;
                printf(&amp;quot;%6s %7.2f %7.2f %9s %8s %10s %s\n&amp;quot;,$pid,&lt;br /&gt;
                 $PID{$pid}{utime},$PID{$pid}{stime},$PID{$pid}{vctx},&lt;br /&gt;
                 $PID{$pid}{ictx},$PID{$pid}{sysc},trunc($Comm{$pid},27));&lt;br /&gt;
                last if --$top == 0;&lt;br /&gt;
        }&lt;br /&gt;
        print &amp;quot;\n&amp;quot; if $MULTI;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 # PrintChild - print a report on Times: utime, stime, wtime, ltime, ttime.&lt;br /&gt;
 #&lt;br /&gt;
 sub PrintChild {&lt;br /&gt;
        my $sort = shift || &amp;quot;ccpu&amp;quot;;&lt;br /&gt;
        my $top = $TOP;&lt;br /&gt;
        my $pid;&lt;br /&gt;
&lt;br /&gt;
        ### Print header&lt;br /&gt;
        printf(&amp;quot;%6s %8s %8s %8s %8s %s\n&amp;quot;,&amp;quot;PID&amp;quot;,&lt;br /&gt;
         &amp;quot;USR&amp;quot;,&amp;quot;SYS&amp;quot;,&amp;quot;CUSR&amp;quot;,&amp;quot;CSYS&amp;quot;,&amp;quot;COMM&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        ### Print report&lt;br /&gt;
        foreach $pid (&amp;amp;SortPID(&amp;quot;$sort&amp;quot;)) {&lt;br /&gt;
                printf(&amp;quot;%6s %8.2f %8.2f %8.2f %8.2f %s\n&amp;quot;,$pid,&lt;br /&gt;
                 $PID{$pid}{utime},$PID{$pid}{stime},$PID{$pid}{cutime},&lt;br /&gt;
                 $PID{$pid}{cstime},trunc($Comm{$pid},32));&lt;br /&gt;
                last if --$top == 0;&lt;br /&gt;
        }&lt;br /&gt;
        print &amp;quot;\n&amp;quot; if $MULTI;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 # SortPID - sorts the PID hash by the key given as arg1, returning a sorted&lt;br /&gt;
 #      array of PIDs.&lt;br /&gt;
 #&lt;br /&gt;
 sub SortPID {&lt;br /&gt;
        my $sort = shift;&lt;br /&gt;
&lt;br /&gt;
        ### Sort numerically&lt;br /&gt;
        if ($sort eq &amp;quot;pid&amp;quot;) {&lt;br /&gt;
                return sort {$a &amp;lt;=&amp;gt; $b} (keys %PID);&lt;br /&gt;
        } else {&lt;br /&gt;
                return sort {$PID{$b}{$sort} &amp;lt;=&amp;gt; $PID{$a}{$sort}} (keys %PID);&lt;br /&gt;
        }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 # getwinsz - gets the terminal window size and returns it as x, y.&lt;br /&gt;
 #      The default size returned is 24x80 if an error is encountered.&lt;br /&gt;
 #&lt;br /&gt;
 sub getwinsz {&lt;br /&gt;
        my $row = 24;&lt;br /&gt;
        my $col = 80;&lt;br /&gt;
        my ($xpix,$ypix,$winsize);&lt;br /&gt;
        my $TIOCGWINSZ = 21608;         # check /usr/include/sys/termios.h&lt;br /&gt;
&lt;br /&gt;
        open(TTY, &amp;quot;+&amp;lt;/dev/tty&amp;quot;) || return($row,$col);&lt;br /&gt;
        ioctl(TTY, $TIOCGWINSZ, $winsize=&amp;#039;&amp;#039;) || return($row,$col);&lt;br /&gt;
        ($row, $col, $xpix, $ypix) = unpack(&amp;#039;S4&amp;#039;, $winsize);&lt;br /&gt;
        return($row,$col);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 # timestruct2int - Convert a timestruct value (64 bits) into an integer&lt;br /&gt;
 #      of seconds.&lt;br /&gt;
 #&lt;br /&gt;
 sub timestruct2int {&lt;br /&gt;
        my $timestruct = shift;&lt;br /&gt;
        my ($secs,$nsecs,$time);&lt;br /&gt;
&lt;br /&gt;
        $secs = $nsecs = $time = 0;&lt;br /&gt;
        ($secs,$nsecs) = unpack(&amp;quot;LL&amp;quot;,$timestruct);&lt;br /&gt;
        $time = $secs + $nsecs * 10**-9;&lt;br /&gt;
        return $time;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 # trunc - Returns a truncated string if required.&lt;br /&gt;
 #&lt;br /&gt;
 sub trunc {&lt;br /&gt;
        my $string = shift;&lt;br /&gt;
        my $length = shift;&lt;br /&gt;
&lt;br /&gt;
        if ($WIDE) {&lt;br /&gt;
                return $string;&lt;br /&gt;
        } else {&lt;br /&gt;
                return substr($string,0,$length);&lt;br /&gt;
        }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 # Usage - print usage message and exit.&lt;br /&gt;
 #&lt;br /&gt;
 sub Usage {&lt;br /&gt;
        print STDERR &amp;lt;&amp;lt;END;&lt;br /&gt;
 prusage ver 0.97&lt;br /&gt;
 USAGE: prusage [-chinuwx] [-p PID] [-s sort] [-t top] [interval] [count]&lt;br /&gt;
&lt;br /&gt;
       prusage               # Default. (-ic 1), fit to screen, 1 secs.&lt;br /&gt;
       prusage -b            # Child times report (must be root or owner)&lt;br /&gt;
       prusage -i            # I/O stats (default)&lt;br /&gt;
       prusage -u            # USR/SYS times&lt;br /&gt;
       prusage -x            # Context Switchs&lt;br /&gt;
       prusage -w            # Wide output&lt;br /&gt;
       prusage -c            # Clear the screen (default)&lt;br /&gt;
       prusage -C            # Don&amp;#039;t clear the screen&lt;br /&gt;
       prusage -T            # Don&amp;#039;t fit to screen (print all lines)&lt;br /&gt;
       prusage -p pid        # Print this PID only&lt;br /&gt;
       prusage -s sort       # Sort on pid,blks,cpu,utime,inblk,vctx,...&lt;br /&gt;
       prusage -t lines      # Print top lines only&lt;br /&gt;
    eg,&lt;br /&gt;
       prusage 2             # 2 second samples (first is historical)&lt;br /&gt;
       prusage 2 5           # 5 x 2 second samples&lt;br /&gt;
       prusage -xi 2         # I/O and Context switch reports, 2 secs&lt;br /&gt;
       prusage -biux 10      # multi output, all reports every 10 secs&lt;br /&gt;
       prusage -C 10         # 10 second samples, no clear screen&lt;br /&gt;
       prusage -CT 10        # 10 second samples, all lines&lt;br /&gt;
       prusage -Ct8 10 5     # 5 x 10 second samples, top 8 lines only&lt;br /&gt;
       prusage -p 11321      # PID 11321 only&lt;br /&gt;
       prusage -s pid        # sort on PID&lt;br /&gt;
 END&lt;br /&gt;
        exit;&lt;br /&gt;
 }&lt;/div&gt;</summary>
		<author><name>AdminWiki</name></author>
	</entry>
</feed>