Es posible que desee utilizar una única memoria intermedia del núcleo para solucionar algunos problemas. Aunque este enfoque puede implementarse con la directiva switch y las construcciones del lenguaje D adecuadas mediante el aumento de una variable en D y la utilización de la acción exit() como predicado, esta implementación no impide la posibilidad de que se produzcan anulaciones. Para solicitar una única memoria intermedia de gran tamaño en el núcleo y continuar con el seguimiento hasta que se rellenen una o más memorias intermedias por CPU, utilice la directiva de memoria intermedia fill. Con esta directiva, el seguimiento continúa hasta que un sondeo habilitado intente realizar un seguimiento de una cantidad de datos superior a los datos que caben en el espacio restante de la memoria intermedia principal. Si persiste la ausencia de espacio disponible, la memoria intermedia se marca como llena y se le notifica al consumidor que se ha rellenado, al menos, una de sus memorias intermedias por CPU. Una vez que dtrace(1M) detecta una única memoria intermedia llena, se detiene el seguimiento, se procesan todas las memorias intermedias y se cierra dtrace. No se realizará ningún seguimiento de ningún dato adicional en la memoria intermedia llena, aunque los datos quepan en la memoria intermedia.
Para utilizar la directiva fill, establezca la opción bufpolicy en fill. Por ejemplo, el siguiente comando realiza un seguimiento de cada entrada de llamada del sistema en una memoria intermedia de 2K por CPU con la directiva de memoria intermedia establecida en fill:
# dtrace -n syscall:::entry -b 2k -x bufpolicy=fill |
Los sondeos END no se activan normalmente hasta que el consumidor de DTrace haya detenido explícitamente el seguimiento. Se garantiza que los sondeos END se activen sólo en una CPU, aunque no se haya definido la CPU en la que se activará el sondeo. Con las memorias intermedias fill, el seguimiento se detiene explícitamente cuando, al menos, una de las memorias intermedias principales por CPU se haya marcado como llena. Si se selecciona la directiva fill, es posible que el sondeo END se active en una CPU con una memoria intermedia llena. Para adaptar el seguimiento de END en las memorias intermedias fill, DTrace calcula la cantidad de espacio consumido potencialmente por los sondeos END y resta este espacio del tamaño total de la memoria intermedia principal. Si el tamaño neto es negativo, DTrace no se iniciará y dtrace(1M) generará una salida con el correspondiente mensaje de error:
dtrace: END enablings exceed size of principal buffer |
El mecanismo de reserva garantiza que una memoria intermedia llena tenga siempre suficiente espacio para cualquier sondeo END.