В выводе vmstat есть несколько полей, которые трудно интерпретировать.
Поле w – одни из них. Да, из мануала мы знаем, что это “the number of swapped out lightweight processes (LWPs) that are waiting for processing resources to finish.” Так и что же стоит делать если это значение не нулевое?
Чаще всего это значит что серверу не хватает оперативной памяти. Но что же делать если эта проблема решена, а значение так и не изменилось?
bash-3.2# vmstat 5 kthr memory page disk faults cpu r b w swap free re mf pi po fr de sr s6 sd sd sd in sy cs us sy id 0 0 84 5041144 290400 1 6 0 0 0 1176 0 0 0 0 7 4231 164 838 0 2 98 0 0 84 5041136 290456 0 0 0 0 0 376 0 0 0 0 0 4228 148 575 0 2 98 0 0 84 5041136 290456 0 0 0 0 0 0 0 0 0 0 0 4232 162 579 0 2 98 0 0 84 5041128 290448 0 0 0 0 0 0 0 0 0 0 0 4227 149 637 0 2 98
Для начала давайте посмотрим lwp каких процессов засвопились:
echo "::walk thread thr |::print kthread_t t_schedflag|::grep .==0 |::eval p_pidp->pid_id" | mdb -k
Или же сразу выведем команду :
echo "::walk thread thr |::print kthread_t t_schedflag|::grep .==0 |::eval p_user.u_comm" | mdb -k
Итак мы знаем lwp каких процессов до сих пор в свопе. И если это число в выводе vmstat не растёт, то и проблем на сервере, скорее всего, тоже нет, но почему-то для многих людей это поле как красная тряпка для быка. Для того, чтобы lwp процесса перешли в нормальное состояние надо чтобы они что-то выполнили. Для этого, например, некоторым приложениям можно послать SIGHUP. Но проще всего конечно-же просто запустить truss на это приложение. truss’у будут нужны некоторые данные о процессе, и тем самым он перейдет обратно, в нормальное состояние.