Sidebar

Para identificar procesos que consuman mucha memoria, podemos usar el comando ps, al igual como lo haciamos para identificar procesos con alto consumo de CPU, solo que en este caso hacemos referencia a las columna de memoria.

[oracle@m9 ~]$ ps -e -o pmem,pid,user,tty,args | grep -i oracle | sort -n -k 1 -r | head

 8.6 29529 oracle   ?        oracleorc11g (LOCAL=NO)
 8.4 30428 oracle   ?        oracleorc11g (LOCAL=NO)
 7.3 30445 oracle   ?        oracleorc11g (LOCAL=NO)
 6.8 18851 oracle   ?        oracleorc11g (LOCAL=NO)

Y para poder buscar el proceso que esta ocupando más memoria en dentro de oracle, ejecutamos el siguiente query dando el valor del proceso que esta consumiendo más memoria, en mi caso 29529.

SET LINESIZE 80 HEADING OFF FEEDBACK OFF
SELECT
  RPAD('USERNAME : ' || s.username, 80) ||
  RPAD('OSUSER   : ' || s.osuser, 80) ||
  RPAD('PROGRAM  : ' || s.program, 80) ||
  RPAD('SPID     : ' || p.spid, 80) ||
  RPAD('SID      : ' || s.sid, 80) ||
  RPAD('SERIAL#  : ' || s.serial#, 80) ||
  RPAD('MACHINE  : ' || s.machine, 80) ||
  RPAD('TERMINAL : ' || s.terminal, 80) ||
  RPAD('SQL TEXT : ' || q.sql_text, 80)
FROM v$session s
    ,v$process p
    ,v$sql     q
WHERE s.paddr          = p.addr
AND   p.spid           = '&PID'
AND   s.sql_address    = q.address(+)
AND   s.sql_hash_value = q.hash_value(+);

Otro forma es usando el comando vmstat (virtual memory statistics)

[oracle@m9 ~]$ vmstat
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 6  0 224688  68784  44952 1279624    1    1    49   126   14    4 13  9 77  1  0

Si observamos que nuestro servidor esta haciendo uso de mucho swapping (columnas si y so) entonces tenemos un cuello de botella en la memoria. En mi caso no lo tengo, pues los valores son practicamente 0:

[oracle@m9 ~]$ vmstat 2 3
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 4  0 224692  70412  45776 1265088    1    1    49   126   14    5 13  9 77  1  0
 5  0 224692  70024  45788 1265252    0    0     2   252 4166 8604 14 45 41  0  0
 3  0 224692  74124  45800 1265288    0    0     0   134 4164 8381 13 43 44  0  0

Para los que desconocen que es swapping, es el proceso de copiar memoria a disco y viceversa. Esto ocurre cuando no existe suficiente memoria para satisfacer las necesidades del servidor. También podemos hacer uso del comando free, para mostrar el uso de memoria actual y virtual(swap).

 

[oracle@m9 ~]$ free
             total       used       free     shared    buffers     cached
Mem:       4063964    3979312      84652          0      46296    1262680
-/+ buffers/cache:    2670336    1393628
Swap:     10241336     224660   10016676

Si anexamos la opcion -s podemos desplegarlo cada n segundos. O usar el comando watch.

[oracle@m9 ~]$ free -s 3


[oracle@m9 ~]$ watch -n 3 -d free
Every 3.0s: free                                                       Tue Jul  6 09:58:18 

2010

             total       used       free     shared    buffers     cached
Mem:       4063964    3994596      69368          0      47340    1270432
-/+ buffers/cache:    2676824    1387140
Swap:     10241336     224660   10016676

Otra forma más de ver la memoria actual y swap es la siguiente.

[oracle@m9 ~]$ cat /proc/meminfo
MemTotal:      4063964 kB
MemFree:         85580 kB
Buffers:         45300 kB
Cached:        1246752 kB
SwapCached:       9160 kB
Active:        3012068 kB
Inactive:       571704 kB
SwapTotal:    10241336 kB
SwapFree:     10016660 kB
Dirty:            2268 kB
Writeback:           0 kB
AnonPages:     2287296 kB
Mapped:         767112 kB
Slab:           109260 kB
SReclaimable:    70500 kB
SUnreclaim:      38760 kB
PageTables:      66480 kB
NFS_Unstable:        0 kB
Bounce:              0 kB
WritebackTmp:        0 kB
CommitLimit:  12273316 kB
Committed_AS:  6468308 kB
VmallocTotal: 34359738367 kB
VmallocUsed:    163756 kB
VmallocChunk: 34359574423 kB
HugePages_Total:     0
HugePages_Free:      0
HugePages_Rsvd:      0
HugePages_Surp:      0
Hugepagesize:     2048 kB
DirectMap4k:     10176 kB
DirectMap2M:   4184064 kB

Para desplegara cada 5 segundos

watch -n 5 -d cat /proc/meminfo

Si vemos que existe una gran cantidad usasa de memoria swap (un valor bajo en SwapFree), es una indicación de que nuestro servidor necesita más memoria. Revisando el uso de memoria de días anteriores Si quisieramos revisar el consumo de memoria de un día diferente del mes, solo necesitamos hacer uso del comando sar con la opción -f. La información que utiliza sar para generar el reporte se localiza en la ruta /var/log/sa con la convencion saNN, donde NN es el día del mes. Por ejemplo, si quisieramos ver las estadísticas de paging de la memoria del primer día del mes, ejecutamos sar con la opción B(estadísticas de paging) y -f (file).

[oracle@m9 ~]$ sar -B -f /var/log/sa/sa01
Linux 2.6.27.25-78.2.56.fc9.x86_64 (m9)         07/01/2010

12:00:01 AM  pgpgin/s pgpgout/s   fault/s  majflt/s  pgfree/s pgscank/s pgscand/s pgsteal/s    %vmeff
12:10:01 AM    282.97   1637.97   2605.06      1.03   1127.19    230.42      2.24    220.26     94.67
12:20:01 AM     85.98   2227.14   2435.13      0.05   1127.23    220.21      1.49    211.45     95.38
12:30:01 AM     43.20   1812.33   2220.57      0.02    986.01    167.66      2.39    155.49     91.44
12:40:01 AM     38.19    174.71   2520.40      0.13    974.44     39.01      0.16     33.15     84.65
12:50:01 AM     33.05    126.10   2526.58      0.00    939.17     19.81      0.26     19.49     97.08
01:00:01 AM      0.94    117.49   2297.94      0.00    842.23      7.13      0.00      6.75     94.68
01:10:01 AM   8517.81   7054.91   2831.65      4.23   5114.19   3894.75     10.41   3802.94     97.38
01:20:01 AM    109.02    129.82   2514.74      0.18    920.41      0.00      0.00      0.00      0.00
01:30:01 AM      3.95    116.88   2320.21      0.02    857.86      0.00      0.00      0.00      0.00

Aqui podemos observar un incremento a las 01:10:01 AM de paging en el disco (pgpgin/s, pgpgout/s). También podemos usar la opción -W para ver el swapping

[oracle@m9 ~]$  sar -W -f /var/log/sa/sa01
Linux 2.6.27.25-78.2.56.fc9.x86_64 (m9)         07/01/2010

12:00:01 AM  pswpin/s pswpout/s
12:10:01 AM      2.25      0.17
12:20:01 AM      0.11      0.38
12:30:01 AM      0.06      0.95
12:40:01 AM      0.26      0.11
12:50:01 AM      0.01      0.14
01:00:01 AM      0.00      0.07
01:10:01 AM     15.60     33.04
01:20:01 AM      0.72      0.00
01:30:01 AM      0.13      0.00
01:40:01 AM      1.57      0.00
01:50:01 AM      1.22      0.00
02:00:01 AM      1.87      3.22
02:10:01 AM     12.91      0.06

Existen varias opciones para mostrar la memoria con sar, otra de ellas es con -r que genera un reporte con estadisticas del uso de memoria y swap.

[oracle@m9 ~]$ sar -r
Linux 2.6.27.25-78.2.56.fc9.x86_64 (m9)         07/06/2010

12:00:01 AM kbmemfree kbmemused  %memused kbbuffers  kbcached kbswpfree kbswpused  %swpused  kbswpcad
12:10:01 AM     34860   4029104     99.14     32620   1324864  10026080    215256      2.10     10328
12:20:01 AM     40468   4023496     99.00     34092   1324428  10026460    214876      2.10     10292
12:30:01 AM     53092   4010872     98.69     37300   1301612  10026096    215240      2.10     10520
12:40:01 AM     57340   4006624     98.59     40412   1298040  10026004    215332      2.10     10580
12:50:01 AM     53336   4010628     98.69     42880   1299500  10025988    215348      2.10     10564
01:00:01 AM     84828   3979136     97.91     43588   1263016  10026028    215308      2.10     10224
01:10:01 AM    237544   3826420     94.15     13268   1156804  10017812    223524      2.18     10268

Tips BD