У меня есть NFS-сервер Solaris 10 на базе ZFS. Физические диски более или менее работают с максимальной скоростью io. Производительность очень плохая - так что шпиндели будем добавлять. NFS служит исключительно хранилищем для гипервизоров XenServer.
Я хочу знать, какие диски виртуальных машин (т.е. файлы .vhd в хранилище) создают большую часть нагрузки. Как я могу запросить файловую систему или, возможно, nfsd, чтобы получить результат iostat или top с именем файла и прочитать / записать. Числа могут быть абсолютными или относительными.
Я попытался iosnoop. Это определенно идет в правильном направлении. К сожалению, не удается получить имена файлов в файловой системе ZFS. У меня нет опыта работы с dtrace. Может, там уже есть сценарий?
Для такого уровня самоанализа вам нужно использовать dtrace. Вот в основном пример nfsv3fileio.d из https://wikis.oracle.com/display/DTrace/nfsv3+Provider, но обновлен для работы в реальном времени (думаю, мое тестирование было минимальным). На этой же странице есть еще несколько примеров. Вы также можете Google ввести "nfssvrtop".
#!/usr/sbin/dtrace -s
#pragma D option quiet
dtrace:::BEGIN
{
trace("Tracing.. hit CTRL-C to end. Updates every 5 seconds.\n");
}
nfsv3:::op-read-done
{
@bytes_read[args[1]->noi_curpath] = sum(args[2]->res_u.ok.data.data_len);
}
nfsv3:::op-write-done
{
@bytes_written[args[1]->noi_curpath] = sum(args[2]->res_u.ok.count);
}
profile:::tick-5sec
{
trunc(@bytes_read, 15);
trunc(@bytes_written, 15);
printf("\n%15s %15s %s\n", "Bytes Read/5s", "Bytes Written/5s", "Pathname");
printa("%@15d %@15d %s\n", @bytes_read, @bytes_written);
trunc(@bytes_read);
trunc(@bytes_written);
}
Есть ли у вас какой-либо уровень кэширования записи NVRAM в вашей настройке? В случае ZFS это будет наличие Устройство ЗИЛ? Если нет, вероятно, это ключ к вашим проблемам с производительностью.