Почему я не вижу столько ошибок страниц, сколько ожидал? - PullRequest
1 голос
/ 26 сентября 2019

Я пытаюсь исследовать поведение Linux при сбое страницы.Я сделал контейнер lxc с ограничением памяти до 1 ГБ (добавив lxc.cgroup.memory.limit_in_bytes = 1G в /etc/lxc/default.conf).Затем я запустил простой код, который получает доступ к объему данных 2 ГБ.

int main() {
  char* buf = malloc(1024*1024*1024);
  char* buf2 = malloc(1024*1024*1024);
  if (buf == 0 || buf2 == 0) {
    printf("Malloc failed!\n");
    return 0;
  }
  int i,j,k;
  for (i=0; i<1024; i++)
    for (j=0; j<1024; j++)
      for (k=0; k<1024; k++)
        buf[i*1024*1024 + j*1024 + k] = i+j+k;
  for (i=0; i<1024; i++)
    for (j=0; j<1024; j++)
      for (k=0; k<1024; k++)
        buf2[i*1024*1024 + j*1024 + k] = i+j+k;
  free(buf);
  free(buf2);
  while(1);
  return 0;
}

Код компилируется с -O0 и запускается внутри контейнера.Когда программа достигает while (1); я проверяю, сколько ошибок страниц она испытывала при

ps -eo maj_flt,cmd | grep a.out

, где a.out - скомпилированный исполняемый файл.Иногда я получаю ошибки 200 ~ 300 страниц;однако иногда я вижу только 10 ~ 20 страниц ошибок.Поскольку память составляет всего 1 ГБ, я думаю, что по крайней мере всегда 1G / 4K = 256 КБ сбой страницы должен происходить.Почему иногда я вижу только ошибку в 10-20 страниц?Я подтвердил, что мой Linux использует страницы по умолчанию 4K.

Я новичок в Linux.Любые идеи будут очень полезны!Спасибо.

1 Ответ

0 голосов
/ 29 сентября 2019

Я выяснил проблему.

  1. Основная проблема с моим кодом заключалась в том, что при первой записи на страницу malloc не происходит сбой страницы, поскольку Linux не должен читать пустоестраница с диска.Я изменил код так, чтобы он дважды выполнял циклическую часть кода.
  2. Кроме того, я отключил чтение заголовка Linux (с помощью echo "0" >> / proc / sys / vm / page-cluster)

С этими двумя изменениями я смог увидеть примерно 2G / 4K = 524 288 ошибок страницы (точно 524 304).

...