A. Fig Lee wrote:2. Тут ситуация такая - приводит ли использование мемори маппед файлов к увеличению щетчика. Согласно многочисленным источникам, фолты всегда возникают при использовании мемори маппед файлов независимо от размера - как минимум при первом обращении. Значит, для чистоты експеримента достаточно копировать маленький файл в цикле - фолты все равно будут, если они регистрируются. Из Солярис Интерналс следует, что при обычной нехватке виртуальной памяти ММУ генерит пейдж фолт и ета пейдж загружается через драйвер. При мемори маппед файлс ММУ ничего не генерит - все вроде бы происходит черз прямой вызов етого драйвера, соответственно, надо полагать щетчик не увеличивается.
Полная каша. Page fault возникает, когда при обращении к виртуальному адресу в таблице трансляции адресов virtal-to-physical для текущего адресного пространства остутствует информация о физической странице. Поскольку таблица эта своя для каждого адресного пространства, это не
означает, что нужной страницы нет в физической памяти. Если она присутствует в памяти и нужно только установить новый map - это minor page fault. В ином случае ее действительно нужно закачать с диска (swap or regular file) и это major page fault. Когда cp копирует файл, она действительно mmap его целиком в адресное пространство (если файл не очень большой), но затем также целиком пишет его в файл одним вызовом write. Таким образом, никакого обращения к страницам файла не происходит и никакие page faults в cp не генерятся. Они возникают ... в ядре(!) во время исполнения системного вызова write. Если копировать маленький файл в цикле, практически все page faults будут minor, поскольку файл будучи один раз закачан в физическую память будет там еще некоторое время оставаться после завершения одного cp и его страницы будут reclaimed следующим cp (при освобождении страницы она необязательно сразу же удаляется из памяти).
Короче, большой rate of page faults на Solaris не обязательно означает swapping и нехватку физической памяти.