Неполадки, связанные с диском или памятью

В то время как большой фрагмент оперативной памяти используется для буферизации файлов, часть данных программы может принудительно выгружаться из памяти на диск. Для временного хранения таких данных служит системное пространство подкачки.

Предположим, что программа считывает очень мало данных или не считывает их вообще, и тем не менее оказывается зависимой от ресурсов ввода-вывода. Кроме того, соотношение между фактическим временем выполнения и суммой времени пользователя и системы не улучшается при предварительном помещении ввода в память. В этом случае производительность программы и эффективность выполнения ее операций ввода-вывода могут быть ограничены ресурсами памяти, и, в частности, ресурсами пространства подкачки. Проверить это предположение можно с помощью следующего сценария vmstatit:
vmstat -s >temp.file   # данные за все время до запуска команды
time $1                   # тестируемая команда
vmstat -s >>temp.file  # данные за все время до конца выполнения
grep "pagi.*ins" temp.file >>results   # выбираются только те данные,
grep "pagi.*outs" temp.file >>results  # которые необходимы

Сценарий vmstatit в сжатом виде выдает основную информацию из отчета команды vmstat -s, содержащего сведения, накопленные с момента запуска системы.

Если этот сценарий оболочки запущен следующей командой:
# vmstatit "cp file1 file2"  2>results
То эта команда создаст следующий вывод:
фактическое    0м0,03с
польз.         0м0,01с
сист.          0м0,02с
     2323 страниц загружено из пространства подкачки
     2323 страниц загружено из пространства подкачки
     4850 страниц выгружено в пространство подкачки
     4850 страниц выгружено в пространство подкачки
Статистика подкачки за время выполнения команды не изменилась. Это говорит о том, что команда cp не выполняла подкачку. Для уточнения ситуации можно вызвать другой вариант сценария оболочки vmstatit:
vmstat -s >temp.file
time $1
vmstat -s >>temp.file
echo "Стандартный ввод:"               >>results
grep "^[ 0-9]*page ins"    temp.file >>results
echo "Стандартный вывод:"               >>results
grep "^[ 0-9]*page outs"   temp.file >>results
echo "Вывод пространства подкачки:"  >>results
grep "pagi.*outs"          temp.file >>results
echo "Ввод пространства подкачки:"   >>results
grep "pagi.*ins"           temp.file >>results
Поскольку всеми обычными операциями ввода-вывода в операционной системе управляет VMM, в выводе команды vmstat -s обычные операции ввода-вывода интерпретируются как операции загрузки и выгрузки страниц. Запуск приведенной выше версии сценария оболочки vmstatit для команды cp, обрабатывающей большой файл, который до этого не был загружен в память, дал следующие результаты:
фактическое    0м2,09с
пользов.       0м0,03с
сист.          0м0,74с
Обычный ввод:
    46416 страниц загружено
    47132 страниц загружено
Обычный вывод:
   146483 страниц выгружено
   147012 страниц выгружено
Вывод в пространство подкачки:
     4854 страниц выгружено в пространство подкачки
     4854 страниц выгружено в пространство подкачки
Ввод из пространства подкачки:
     2527 страниц загружено из пространства подкачки
     2527 страниц загружено из пространства подкачки

Вывод команды time подтверждает предположение о том, что производительность программы ограничена ресурсами ввода-вывода. Увеличение количества загруженных страниц указывает на число операций ввода-вывода, необходимое для выполнения команды cp. Увеличение количества выгруженных страниц означает, что файл достаточно велик для того, чтобы при его обработке ожидающие выгрузки страницы (возможно, не относящиеся к этому файлу) принудительно выгружались на диск. Сохранение общего количества операций ввода-вывода, связанных с подкачкой, подтверждает, что команда cp не создает очень больших структур данных, способных исчерпать ресурсы памяти системы, на которой проводится эксперимент.

Порядок, в котором эта версия сценария vmstatit выдает информацию об операциях ввода-вывода, выбран не случайно. Обычная программа сначала считывает свои входные данные, а затем записывает выходные. Подкачка же обычно начинается с выгрузки ненужной страницы из рабочего сегмента. Эта страница загружается обратно в память только в том случае, если программа пытается обратиться к ней. То обстоятельство, что в тестируемой системе количество страниц, выгруженных в пространство подкачки с момента загрузки, почти вдвое превышает количество страниц, загруженных в пространство подкачки за то же время, означает, что некоторые программы, выполняемые в системе, помещают в память свои данные и больше не обращаются к ним. Дополнительная информация приведена в разделе Программы с ограничением по памяти. Обратитесь также к разделу Быстродействие памяти.

Для того чтобы показать, как будут выглядеть результаты выполнения этого сценария в случае, когда производительность программы ограничена объемом памяти, рассмотрим следующую ситуацию. Сначала проанализируем работу программы при достаточно большом объеме памяти (32 МБ), а затем с помощью команды rmss (см. раздел Оценка необходимого объема памяти с помощью команды rmss) искусственно уменьшим объем памяти. Последовательность команд
# cc -c ed.c
# vmstatit "cc -c ed.c" 2>results
сначала загружает в память исходный файл длиной 7944 строки и исполняемый файл компилятора C, а затем повторно измеряет количество операций ввода-вывода:
фактическое    0м7,76с
польз.         0м7,44с
сист.          0м0,15с
Обычный ввод:
    57192 страниц загружено
    57192 страниц загружено
Обычный вывод:
   165516 страниц выгружено
   165553 страниц выгружено
Вывод в пространство подкачки:
    10846 страниц выгружено в пространство подкачки
    10846 страниц выгружено в пространство подкачки
Ввод из пространства подкачки:
     6409 страниц загружено из пространства подкачки
     6409 страниц загружено из пространства подкачки
Очевидно, что ресурсы ввода-вывода не замедляют обработку программы. В данном случае, для считывания исходного кода операции ввода-вывода вообще не нужны. Если теперь с помощью команды
# rmss -c 8
уменьшить рабочий объем памяти компьютера до 8 МБ, а затем повторно ввести ту же последовательность команд, то результат будет следующим:
фактическое    0м9,87с
пользов.       0м7,70с
сист.          0м0,18с
Обычный ввод:
    57625 страниц загружено
    57809 страниц загружено
Обычный вывод:
   165811 страниц выгружено
   165882 страниц выгружено
Вывод в пространство подкачки:
    11010 страниц выгружено в пространство подкачки
    11061 страниц выгружено в пространство подкачки
Ввод из пространства подкачки:
     6623 страниц загружено из пространства подкачки
     6701 страниц загружено из пространства подкачки

Появились следующие признаки того, что производительность программы ограничена скоростью ввода-вывода:

  • Фактическое время выполнения больше, чем общее время работы процессора
  • Значительный объем обычных операций ввода-вывода при повторном выполнении команды
Увеличение фактического времени выполнения при уменьшении доступного объема памяти и значительное число операций подкачки свидетельствуют о том, что работа компилятора осложнена из-за недостатка памяти.
Прим.: Этот пример иллюстрирует влияние нехватки памяти на работу программы. Поскольку в данном случае не был уменьшен объем памяти, используемый другими процессами, точный объем памяти, начиная с которого компилятор вынужден применять подкачку, таким способом определить нельзя.
Для снятия ограничений на доступный объем памяти введите команду:
# rmss -r

Эта команда разрешает операционной системе использовать память, заблокированную командой rmss, то есть восстанавливает обычный объем оперативной памяти в системе.