[dtrace] Просмотр открытых файлов

В комплекте dtrace tool kit есть скрипт opensnoop, который позволяет просматривать открытые файлы в режиме реального времени.

Пример использования.

./opensnoop.d -x -n php
  UID    PID COMM          FD PATH
  620   8483 php           -1 /var/ld/ld.config
  620   8483 php           -1 /bin//php-cli.ini
  620   8483 php           -1 /soft/sun_free/php/php-cli.ini
  620   8483 php           -1 /bin//php.ini
...

FD — файл дескриптор (-1 значит ошибка, что файл не существует)

Хочу так же представить полезные скрипты написанные Julien Gabel (автор ресурса http://blog.thilelli.net/)

— readfile.d (показывает полный путь к открытым файлам (read) заданного приложения и количество обращений)

Пример использования.

# readfile.d php 5s

Исходник.

#!/usr/sbin/dtrace -s
#pragma D option quiet

dtrace:::BEGIN
{
  printf("%s %s %s", "Sampling for", $$2, "... Please wait.");
}

syscall::*read:entry
/execname == $$1/
{
  self->thr = 1;
  self->fd = arg0;
}

syscall::*read:return
/self->thr/
{
  /*
   * About resolving the file name (self->vpath):
   * Shamefully stolen from the `rwsnoop' dtrace script (found
   * in the DTraceToolkit), by Brendan Gregg.  Please refer to
   * http://www.brendangregg.com/dtrace.html for more information
   * on DTrace tools and good examples.
   */
  this->filistp = curthread->t_procp->p_user.u_finfo.fi_list;
  this->ufentryp = (uf_entry_t *)((uint64_t)this->filistp +
   (uint64_t)self->fd * (uint64_t)sizeof(uf_entry_t));
  this->filep = this->ufentryp->uf_file;
  this->vnodep = this->filep != 0 ? this->filep->f_vnode : 0;
  self->vpath = this->vnodep ? (this->vnodep->v_path != 0 ?
   cleanpath(this->vnodep->v_path) : "") : "";

  @rnum[self->vpath] = count();
  self->thr = 0;
  self->fd = 0;
  self->vpath = 0;
}

profile:::tick-$2
{
  printf("%-80s %7s", "FILE NAME", "COUNT");
  printa("%-80s %@7d", @rnum);
  exit(0);
}

— readid.d (показывает pid, приложение, количество обращений read)

Пример использования.

# ./readid.d php 5s

Исходник.

#!/usr/sbin/dtrace -s
#pragma D option quiet

dtrace:::BEGIN
{
  printf("%s %s %s", "Sampling for", $$2, "... Please wait.");
}

syscall::*read:entry
/execname == $$1/
{
  self->thr = 1;
}

syscall::*read:return
/self->thr/
{
  @ridnum[execname,pid] = count();
  self->thr = 0;
}

profile:::tick-$2
{
  printf("%-15s %10s %10s", "PROGRAM", "PID", "COUNT");
  printa("%-15s %10d %@10d", @ridnum);
  exit(0);
}

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *