
Como monitorar o tamanho dos iops de armazenamento em um Linux moderno?
Consigo monitorar a quantidade de iops de armazenamento usando comandos como iostat. Porém gostaria de saber o tamanho dos iops gerados pela carga de trabalho.
Algo como, nos últimos X segundos foram: 5 iops 4K, 10 iops 8K, 20 iops 16K...
Estou interessado em monitorar no nível do dispositivo de bloco (por exemplo:/dev/sda), porém em qualquer outro nível também seria interessante.
Responder1
Nível baixo
No nível baixo, você pode obter essas informações em /sys/block/X/stat
, que está documentadoaqui.
O conteúdo de exemplo é semelhante a:
10465 3250 759844 27528 4400 2983 546848 66306 0 9754 93792
Os campos que queremos são as colunas 1 e 3 para leituras e 5 e 7 para gravações. O método de cálculo é o mesmo para ambos, então discutirei apenas as leituras.
A coluna 1 é o número de leituras (que você afirmou que já consegue monitorar) e a coluna 3 é o número de setores lidos. Um setor tem 512 bytes. Então, com isso, para calcular o tamanho das leituras, basta fazer $col3 * 512 / $col1
.
Os números neste arquivo são o total desde que o disco ficou online. Portanto, para calcular o tamanho médio de leitura durante um período de tempo, basta ler o arquivo duas vezes e calcular com: ($col3_t2 - $col3_t1) * 512 / ($col1_t2 - $col1_t1)
.
Observe que o método acima fornece o tamanho dos OPs executados no nível do aplicativo (a descrição não é exata, mas é próxima o suficiente). O kernel pode mesclar várias operações para que o número de operações executadas no disco seja menor. O cálculo para isso é: $col3 * 512 / ($col1 - $col2)
. E para obter o valor ao longo de um período de tempo:($col3_t2 - $col3_t1) * 512 / (($col1_t2 - $col1_t1) - ($col2_t2 - $col2_t1))
Alto nível
iostat
também pode fornecer o valor, mas com menos precisão. Ele não diferencia gravações ou leituras e apenas fornece o valor em setores, não em bytes (então, novamente, multiplique por 512). Mas o comando é iostat -x -d
e a coluna a ser observada é avgrq-sz
.