Ошибки из-за отсутствия страниц



Предыдущая | Следующая


Если страница памяти не готова, когда процессу необходимо ее использовать, 
процесс вызывает ошибку из-за отсутствия страницы. При возникновении та­
кого события ядро забирает у процесса управление процессором, чтобы подгото­
вить страницу. Существуют два типа ошибок из­за отсутствия страниц: малые 
и большие.
Малые ошибки
Малая ошибка из­за отсутствия страницы возникает тогда, когда желаемая страница 
фактически находится в основной памяти, но модуль MMU не знает, где она. Такое 
может произойти, когда процесс требует больше памяти или когда модуль MMU не 
обладает достаточным пространством для хранения всех местоположений страниц 
для процесса. В таком случае ядро сообщает модулю MMU данные о странице и по­
зволяет процессу продолжить работу. Малые ошибки из­за отсутствия страницы не 
столь уж существенны, и многие из них возникают во время работы процесса. Если 
вам не требуется максимальная производительность какой­либо программы, интен­
сивно обращающейся к памяти, вероятно, не стоит беспокоиться об этих ошибках.
Большие ошибки
Большая ошибка из­за отсутствия страницы возникает тогда, когда желаемая стра­
ница памяти не находится в основной памяти и, значит, ядро должно загрузить ее 
с диска или из какого­либо другого медленного хранилища данных. Большое ко­
личество таких ошибок сильно замедлит работу системы, поскольку ядро должно 
выполнить довольно солидную работу по снабжению процессов страницами, ли­
шая нормальные процессы возможности работать.
Некоторых больших ошибок невозможно избежать: например, когда код загру­
жается с диска при запуске программы в первый раз. Самые серьезные проблемы 
возникают, когда памяти становится недостаточно и ядро начинает подкачивать 
страницы из рабочей памяти на диск, чтобы освободить место для новых страниц.
Отслеживание ошибок из-за отсутствия страниц
Можно отследить ошибки страниц для отдельных процессов с помощью команд 
ps, top и time. Следующая команда показывает простой пример того, как команда 
time отображает ошибки страниц. Результаты работы команды cal не имеют зна­
чения, поэтому мы их отключили, перенаправив в устройство /dev/null.
$ /usr/bin/time cal > /dev/null
0.00user 0.00system 0:00.06elapsed 0%CPU (0avgtext+0avgdata 3328maxresident)k
648inputs+0outputs (2major+254minor)pagefaults 0swaps
Как можно заметить из выделенного жирным шрифтом текста, при работе про­
граммы произошли две большие и 254 малые ошибки из­за отсутствия страниц. Боль­
шие ошибки возникли, когда ядру потребовалось загрузить команду с диска в первый 
раз. Если бы вы запустили эту команду повторно, то больших ошибок, вероятно, не 
было бы, поскольку ядро выполнило кэширование страниц с диска.
Если вы хотите увидеть ошибки для работающих процессов, воспользуйтесь 
командой top или ps. При запуске команды top используйте флаг f, чтобы изменить 
отображаемые поля, и флаг u, чтобы отобразить количество больших ошибок. Ре­
зультаты будут показаны в новом столбце, nFLT. Количество малых ошибок вы не 
увидите.
При использовании команды ps можно применить специальный формат выво­
да, чтобы увидеть ошибки для конкретного процесса. Вот пример для процесса 
с идентификатором ID 20365:
$ ps -o pid,min_flt,maj_flt 20365
PID MINFL MAJFL
20365 834182 23
Столбцы MINFL и MAJFL показывают число малых и больших ошибок из­за отсут­
ствия страниц. Конечно, можно сочетать все это с любыми другими параметрами 
выбора процессов, как рассказано на странице руководства ps(1).
Просмотр страниц ошибок по процессам может помочь вам сконцентрировать­
ся на отдельных проблематичных компонентах. Тем не менее, если вы заинтересо­
ваны в производительности системы в целом, вам необходим инструмент, позво­
ляющий вывести итог по использованию процессора и памяти всеми процессами.