Inspecionar operações IO no sistema FreeBSD

4

Eu gostaria de saber se há alguma maneira de inspecionar / interceptar operações de IO no FreeBSD. Como o ktrace, mas se eu não sei o processo (o que leva algum tempo grande, por exemplo).

    
por Sergey Efimov 20.08.2016 / 04:47

3 respostas

4

Para monitoramento e análise de desempenho, você tem uma ferramenta semi-programável muito poderosa chamada dtrace .

O dtrace permite construir linha de comando ou pequenos programas que lhe permitirão acompanhar as necessidades das chamadas do sistema.

É um pouco poderoso e complexo. e você pode encontrar alguns exemplos em torno, incluindo um livro muito interessante Desempenho de sistemas: empresa e nuvem

Na página de Ferramentas do DTrace :

DTrace, an implementation of dynamic tracing that is available in different OSes (Solaris, Mac OS X, FreeBSD, ...). DTrace helps troubleshoot problems on servers by providing new detailed views of application and system internals, to a level that was previously difficult or impossible to access. It provides a language to write DTrace scripts that is similar to C and awk and is event based.

# Files opened by process:
dtrace -n 'syscall::open*:entry { printf("%s %s",execname,copyinstr(arg0)); }'

# Read bytes by process:
dtrace -n 'sysinfo:::readch { @bytes[execname] = sum(arg0); }'

# Write bytes by process:
dtrace -n 'sysinfo:::writech { @bytes[execname] = sum(arg0); }'

# Read size distribution by process:
dtrace -n 'sysinfo:::readch { @dist[execname] = quantize(arg0); }'

# Write size distribution by process:
dtrace -n 'sysinfo:::writech { @dist[execname] = quantize(arg0); }'
    
por 20.08.2016 / 13:55
4

Como dito em outra resposta, o DTrace é uma ferramenta poderosa para rastrear a atividade do sistema e pode ser usada para essa tarefa também.

Alguns scripts do Dtrace são portáteis, mas muitos são específicos do sistema operacional. Muitos scripts úteis podem ser encontrados no Dtrace Toolkit , mas o rwsnoot e o opensnoop ainda não funcionam no FreeBSD.

Para monitorar syscalls abertas, esse script pode ser usado:

#!/usr/sbin/dtrace -s

dtrace:::BEGIN
{
    printf("%5s %5s %s","UID","PID", "Command  Path");
}

syscall::open*:entry
{
    printf("%5d %5d %s %s", uid, pid, execname,
                    probefunc == "open" ? copyinstr(arg0) : copyinstr(arg1));
}

Script simples (mas não muito útil) para leitura / gravação

#!/usr/sbin/dtrace -s

syscall::*read:entry,
syscall::*write:entry
{
    printf("%5d %s CALL %s(%d, .., %d)", pid, execname, probefunc, arg0, arg2);
    self->fd = arg0;
}

syscall::*readv:entry,
syscall::*writev:entry
{
     printf("%5d %s CALL %s(%d, ...)", pid, execname, probefunc, arg0);
}

syscall::*read*:return
{
    printf("%5d %s fd %d read %d bytes", pid, execname, self->fd, arg0);
    self->fd = 0;
}

syscall::*write*:return
{
    printf("%5d %s fd %d wrote %d bytes", pid, execname, self->fd, arg0);
    self->fd = 0;
}

Você provavelmente precisará de algum filtro. Por exemplo. não rastreie o dtrace self:

syscall::foobar:entry
/execname != "dtrace"/
{
    ...
}
    
por 20.08.2016 / 19:22
1

Pessoalmente, costumo usar top -m io .

    
por 02.10.2016 / 18:43