2012-05-16 12 views
9

Si hay un proceso que lee un archivo grande y lo guarda en su memoria (o simplemente un char * malloced), y ese proceso principal se bifurca, si el proceso secundario solo lee desde esa memoria (o el char *), según copy-on-write, la memoria donde se guarda el puntero no se copia, y tanto el padre como el hijo comparten la misma memoria hasta que cualquiera de ellos intente escribir en esa memoria, en cuyo caso el proceso hace una copia de la memoria y cambia eso.¿Cómo encontrar cuánta memoria se comparte entre el proceso bifurcado con copy-on-write en Linux?

Así que mi pregunta es si hay una escritura de copiar implementada, ¿hay alguna manera de saber la cantidad de memoria que usa el niño que no se comparte con el proceso principal? En otras palabras, ¿cuánta memoria usa realmente un proceso secundario si usa la memoria de algunos padres de algunas llamadas leídas?

superior, o los comandos ps solo darán la cantidad total de memoria que el niño debe tener. (es decir, suponiendo que el niño copia los datos en la memoria o el puntero).

¿Hay alguna manera de obtener la cantidad de datos que realmente usa la semántica de CoW?

Pasé por /proc/[pid]/smaps según lo sugerido por aix y Mat, pero todo lo que encontré fue un montón de archivos de smaps vacíos. Probé este comando para encontrar los archivos que tiene datos en ellos: tail -n 5 */smaps | less Y la O/P que me dieron fue

==> 1012/smaps <== 

==> 1074/smaps <== 

==> 10/smaps <== 

==> 1148/smaps <== 

==> 11862/smaps <== 

==> 11/smaps <== 

==> 1355/smaps <== 

==> 1356/smaps <== 

==> 1357/smaps <== 

==> 1358/smaps <== 

==> 1361/smaps <== 

==> 13/smaps <== 

==> 14900/smaps <== 

==> 14/smaps <== 

==> 1501/smaps <== 

==> 15/smaps <== 

==> 1684/smaps <== 

==> 1685/smaps <== 

==> 16/smaps <== 

==> 17772/smaps <== 

==> 17827/smaps <== 

==> 17/smaps <== 

==> 18490/smaps <== 

==> 18/smaps <== 

==> 1932/smaps <== 

==> 1934/smaps <== 

==> 19863/smaps <== 

==> 19/smaps <== 

==> 1/smaps <== 

==> 20125/smaps <== 

==> 20126/smaps <== 

==> 20127/smaps <== 

==> 20128/smaps <== 

==> 20129/smaps <== 

==> 20134/smaps <== 

==> 20135/smaps <== 

==> 20811/smaps <== 

==> 20868/smaps <== 

==> 20/smaps <== 

==> 21116/smaps <== 

==> 21774/smaps <== 

==> 21/smaps <== 

==> 22393/smaps <== 

==> 22394/smaps <== 

==> 22395/smaps <== 

==> 22398/smaps <== 

==> 22639/smaps <== 

==> 22824/smaps <== 

==> 22/smaps <== 

==> 23009/smaps <== 

==> 23058/smaps <== 

==> 23059/smaps <== 
Private_Dirty:   0 kB 
Referenced:   0 kB 
Swap:     0 kB 
KernelPageSize:  4 kB 
MMUPageSize:   4 kB 

==> 23835/smaps <== 

==> 23961/smaps <== 

==> 23962/smaps <== 

==> 23963/smaps <== 

==> 23964/smaps <== 

==> 23/smaps <== 

==> 24180/smaps <== 

==> 24268/smaps <== 

==> 24467/smaps <== 

==> 24/smaps <== 

==> 252/smaps <== 

==> 25352/smaps <== 

==> 25435/smaps <== 

==> 25/smaps <== 

==> 26465/smaps <== 

==> 26/smaps <== 

==> 27884/smaps <== 

==> 27/smaps <== 

==> 28/smaps <== 

==> 29/smaps <== 

==> 2/smaps <== 

==> 303/smaps <== 

==> 30/smaps <== 

==> 316/smaps <== 

==> 31/smaps <== 

==> 32074/smaps <== 

==> 32076/smaps <== 

==> 32112/smaps <== 
Private_Dirty:   0 kB 
Referenced:   0 kB 
Swap:     0 kB 
KernelPageSize:  4 kB 
MMUPageSize:   4 kB 

==> 32116/smaps <== 
Private_Dirty:   0 kB 
Referenced:   0 kB 
Swap:     0 kB 
KernelPageSize:  4 kB 
MMUPageSize:   4 kB 

==> 322/smaps <== 

==> 32466/smaps <== 

==> 32467/smaps <== 

==> 32/smaps <== 

==> 33/smaps <== 

==> 34/smaps <== 

==> 37/smaps <== 

==> 38/smaps <== 

==> 3991/smaps <== 

==> 3992/smaps <== 

==> 39/smaps <== 

==> 3/smaps <== 

==> 4005/smaps <== 

==> 4006/smaps <== 

==> 4007/smaps <== 

==> 4008/smaps <== 

==> 4009/smaps <== 

==> 4010/smaps <== 

==> 4018/smaps <== 

==> 4029/smaps <== 

==> 4038/smaps <== 

==> 4044/smaps <== 

==> 4045/smaps <== 

==> 4046/smaps <== 

==> 4053/smaps <== 

==> 4054/smaps <== 

==> 4055/smaps <== 

==> 40/smaps <== 

==> 41/smaps <== 

==> 42/smaps <== 

==> 4339/smaps <== 

==> 435/smaps <== 

==> 436/smaps <== 

==> 43/smaps <== 

==> 44/smaps <== 

==> 45/smaps <== 

==> 46/smaps <== 

==> 47/smaps <== 

==> 48/smaps <== 

==> 49/smaps <== 

==> 4/smaps <== 

==> 50/smaps <== 

==> 51/smaps <== 

==> 52/smaps <== 

==> 53/smaps <== 

==> 54/smaps <== 

==> 55/smaps <== 

==> 56/smaps <== 

==> 57/smaps <== 

==> 58/smaps <== 

==> 5988/smaps <== 

==> 59/smaps <== 

==> 5/smaps <== 

==> 6058/smaps <== 

==> 6059/smaps <== 
Private_Dirty:   0 kB 
Referenced:   0 kB 
Swap:     0 kB 
KernelPageSize:  4 kB 
MMUPageSize:   4 kB 

==> 60/smaps <== 

==> 61/smaps <== 

==> 62/smaps <== 

==> 63/smaps <== 

==> 64/smaps <== 

==> 65/smaps <== 

==> 66/smaps <== 

==> 67/smaps <== 

==> 68/smaps <== 

==> 69/smaps <== 

==> 6/smaps <== 

==> 70/smaps <== 

==> 71/smaps <== 

==> 72/smaps <== 

==> 73/smaps <== 

==> 74/smaps <== 

==> 771/smaps <== 

==> 77/smaps <== 

==> 782/smaps <== 

==> 78/smaps <== 

==> 79/smaps <== 

==> 7/smaps <== 

==> 80/smaps <== 

==> 814/smaps <== 

==> 819/smaps <== 

==> 81/smaps <== 

==> 82/smaps <== 

==> 83/smaps <== 

==> 84/smaps <== 

==> 8654/smaps <== 

==> 8655/smaps <== 

==> 8656/smaps <== 

==> 892/smaps <== 

==> 8/smaps <== 

==> 949/smaps <== 

==> 950/smaps <== 

==> 9/smaps <== 

==> self/smaps <== 
Private_Dirty:   0 kB 
Referenced:   0 kB 
Swap:     0 kB 
KernelPageSize:  4 kB 
MMUPageSize:   4 kB 

Entonces, ¿qué se supone que debo hacer ahora? Tengo procesos que tienen smaps en blanco que se están ejecutando. ¿Cómo puedo obtener el toque de esos pid?

+1

Depende del sistema operativo. Linux? – Mat

+0

sí, el os es linux. –

+4

http://unix.stackexchange.com/questions/33381/getting-information-about-a-process-memory-usage-from-proc-pid-smaps te puede interesar – Mat

Respuesta

5

no sé de una herramienta que le daría esta información, pero es probable que pueda calcular esta basada en /proc/[pid]/smaps:

/proc/[pid]/smaps (since Linux 2.6.14) 
      This file shows memory consumption for each of the process’s mappings. 
      For each of mappings there is a series of lines such as the following: 

       08048000-080bc000 r-xp 00000000 03:02 13130  /bin/bash 
       Size:    464 kB 
       Rss:    424 kB 
       Shared_Clean:  424 kB 
       Shared_Dirty:   0 kB 
       Private_Clean:  0 kB 
       Private_Dirty:  0 kB 

      The first of these lines shows the same information as is displayed for 
      the mapping in /proc/[pid]/maps. The remaining lines show the size of 
      the mapping, the amount of the mapping that is currently resident in RAM, 
      the number of clean and dirty shared pages in the mapping, and the number 
      of clean and dirty private pages in the mapping. 

Para más detalles, véase Getting information about a process' memory usage from /proc/pid/smaps.

+0

¿podría decirme otra alternativa que/proc/pid/maps o smaps ya que ambos archivos están vacíos? –

+0

@PrasanthMadhavan: ¿Están vacíos incluso para sus propios procesos? – NPE

+0

yup. todos están vacíos. Ver mi pregunta Muestra smaps pero los mapas también son los mismos .. –

Cuestiones relacionadas