Почему я не вижу столько ошибок страниц, сколько ожидал?

Вы изобретаете велосипед (и неправильно ). Используйте jqдля создания JSON.

 lsof -Pn | 
   awk '/LISTEN/ {print $1,$2,$3,$4, $5,$8,$9}' |
   jq -R 'split(" ") |
         {
           command:.[0],
           pid:.[1],
           user:.[2],
           fd:.[3],
           protocol: "\(.[4]):\(.[5])", 
           host:.[6]
         }'

Если ваша версия jqподдерживает регулярные выражения, вы также можете отказаться от вызова awk:

lsof -Pn | jq -R '
  select(match("LISTEN")) |
  [splits("  *")] |
  {
    command:.[0],
    pid:.[1],
    user:.[2],
    fd:.[3],
    protocol: "\(.[4]):\(.[7])", 
    host:.[8]
  }'
0
27.09.2019, 01:01
3 ответа

Я понял проблему.

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

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

1
28.01.2020, 02:39

Почему вы видите ошибки страниц в памяти, которые записываются в первый раз для каждой страницы? Это больше -или -меньше наихудшего результата для подсистемы виртуальной памяти. В результате любая оптимизация, кэширование, предварительная загрузка, обнаружение схемы доступа и т. д. уменьшат это число. Я был бы удивлен, если бы ЛЮБАЯ операционная система надежно дала вам расчетные 256 тысяч ошибок страниц, если бы вы попробовали это.

0
28.01.2020, 02:39

Вы скомпилировали его с включенной оптимизацией, и компилятор удалил ваши циклы , clang преобразует всю вашу программу в:

int main() {
  while(1);
}
0
28.01.2020, 02:39

Теги

Похожие вопросы