Иногда fsck показывает, что файловая система не имеет никаких ошибок, но в действительности это имеет. У меня была подобная проблема однажды, и если Вы хотите проверить, что файловая система, необходимо применить силу. Я не уверен, какую файловую систему Вы используете, но давайте предположим, что это - ext4:
Emergency help:
-p Automatic repair (no questions)
-n Make no changes to the filesystem
-y Assume "yes" to all questions
-c Check for bad blocks and add them to the badblock list
-f Force checking even if filesystem is marked clean
-v Be verbose
-b superblock Use alternative superblock
-B blocksize Force blocksize when looking for superblock
-j external_journal Set location of the external journal
-l bad_blocks_file Add to badblocks list
-L bad_blocks_file Set badblocks list
Так, строка, в которой Вы нуждаетесь:
# fsck.ext4 -pvf /dev/sda1
Для создания основных неисправностей страницы необходимо заставить читать с диска. Следующий код отображает файл, приведенный в командной строке, сообщив ядру, это не нужно; Если файл достаточно велик (выберите большой файл в / usr / bin
), вы всегда получите большие неисправности страницы:
#include <fcntl.h>
#include <stdio.h>
#include <sys/mman.h>
#include <sys/stat.h>
int main(int argc, char ** argv) {
int fd = open(argv[1], O_RDONLY);
struct stat stats;
fstat(fd, &stats);
posix_fadvise(fd, 0, stats.st_size, POSIX_FADV_DONTNEED);
char * map = (char *) mmap(NULL, stats.st_size, PROT_READ, MAP_SHARED, fd, 0);
if (map == MAP_FAILED) {
perror("Failed to mmap");
return 1;
}
int result = 0;
int i;
for (i = 0; i < stats.st_size; i++) {
result += map[i];
}
munmap(map, stats.st_size);
return result;
}
на пути работы по ошибкам, это просто чтобы продемонстрировать идею. В моей системе
gcc majorfault.c -o majorfault && /usr/bin/time -v ./majorfault /usr/bin/git-annex
всегда производит 154 неисправности главных страниц.
Эта программа на языке C приводит к тому, что график давления памяти на моем Mac увеличивает PDQ:
#include <stdlib.h>
int main(void)
{
while (1) {
char* p = malloc(1 * 1024 * 1024 * 1024);
for (int i = 0; i < 1024; ++i) {
p[i * 1024 * 1024] = 0; /* touch the pages */
}
}
return 0;
}
Внутренний цикл важен. Если вы не коснётесь хотя бы некоторых выделенных страниц памяти, подсистема управления памятью достаточно умна, чтобы понять, что вы просто просите памяти, которую никогда не используете. Однако, это вполне может быть реализацией, специфичной для OS X.