Сколько памяти можно заблокировать до того, как система начнет переставлять / перебивать?

Я пытаюсь использовать Memtester в качестве теста на стресс и правильность памяти для Linux- систем моей организации. Memtester в основном просто берет количество памяти для проверки в качестве аргумента, блокирует столько памяти, используя memlock(), а затем запускает несколько шаблонов, чтобы убедиться, что память исправна.

Поскольку я пытаюсь проверить правильность, я хочу проверить как можно больше памяти машины. Я пытался сделать это, передавая MemFree из /proc/meminfo. Или, скорее, у меня есть скрипт, который порождает несколько процессов, каждый из которых запрашивает MemFree (см. Ниже), потому что ОС не позволяет одному процессу блокировать более 50% памяти.

Проблема заключается в том, что, если я блокирую более ~90% памяти, мой компьютер блокируется, предположительно из-за перегрузки. Примерно через 30 минут я наконец смог использовать его снова.

Есть ли способ, программно или иным образом, узнать, сколько памяти я могу заблокировать до того, как она начнет меняться?

Я хочу, чтобы это работало на любом компьютере с Linux, поэтому все, что требует от меня изменения конфигурации системы, не требуется. Кроме того, вы можете предположить, что тест будет единственным, что выполняется в системе (конечно, помимо нормальной работы ОС), поскольку машины должны оставаться одни, пока мы их тестируем.


часть скрипта, которая порождает процессы memtester

    while [ $MEMAVAILABLE -ge 0 ] 
    do
        ./memtester $MEMAVAILABLE'K' &
        sleep 10 #wait for previous process to lock its memory
        MEMFREE=`cat /proc/meminfo | grep "MemFree" | sed 's/MemFree:\(\s\)*\(.*\) kB/\2/g'`
        MEMAVAILABLE=$(($MEMFREE-($MEMTOTAL*5/100)))
    done
    wait

,

1 ответ

Ваш сценарий, вероятно, выделяет слишком много из-за состояния гонки. В Statement1 и Statement2 оператор2 может выполняться раньше, и цикл будет продолжен. И так далее.

Вы не можете выделить больше памяти? Я думаю, я бы попытался поиграть с ulimit,

Теперь к главному пункту - сколько мем. Linux не работает на DOS-подобной модели в отношении "свободной" памяти. Метрика MemFree должна действительно называться MemFreeImmediatelyAvailable. Вы можете выделить гораздо больше, и ничего не произойдет, кроме, возможно, небольшого подкачки. Но если вы используете память, это не означает, что MemFree уменьшится - ядро ​​преобразует Inact_clean в MemFree, как только сможет, чтобы поддерживать определенный минимальный размер MemFree (еще одна причина, по которой ваш скрипт будет использовать слишком много). Основным примером категории Inact_clean обычно является кэш чтения для файловой системы - ядро ​​может немедленно "отбросить" его, поскольку программе требуется больше памяти. Я не говорю, что вы можете спокойно съесть все это, но большая часть, да, вы можете.

  • Активный: Память, которая использовалась совсем недавно и, как правило, не восстанавливается, если в этом нет крайней необходимости.
  • Inact_dirty: Dirty означает "может потребоваться запись на диск или подкачка". Требуется больше работы, чтобы освободить. Примерами могут быть файлы, которые еще не были записаны. Они не записываются в память слишком рано для того, чтобы уменьшить ввод / вывод. Например, если вы пишете журналы, лучше подождать, пока у вас не будет готов полный журнал, прежде чем отправлять его на диск.
  • Inact_clean: считается легко доступным. Ядро будет стараться держать в чистоте некоторые вещи, чтобы всегда было немного места для дыхания.
  • Inact_target: просто метрика цели, которую ядро ​​использует, чтобы убедиться, что вокруг достаточно страниц. При превышении ядро ​​не будет выполнять работу по перемещению страниц с активного на неактивное. Страница также может стать неактивной несколькими другими способами, например, если вы выполняете длинный последовательный ввод-вывод, ядро ​​предполагает, что вы не собираетесь использовать эту память, и делает ее неактивной в превентивном режиме. Таким образом, вы можете получить больше неактивных страниц, чем целевой, потому что ядро ​​помечает некоторый кеш как "с большей вероятностью, что он никогда не будет использован" и позволяет ему использовать чит в "последнем использованном" порядке.

http://www.redhat.com/advice/tips/meminfo.html

Наконец, я считаю это более элегантным эквивалентом:

sed -n '/MemFree/s/.*MemFree:\s*\([0-9]*\) kB.*/\1/gp' /proc/meminfo
Другие вопросы по тегам