Там нет разницы между tmpfs и shm. tmpfs - это новое имя для shm. shm означает SHaredMemory.
Смотрите: Linux tmpfs .
Основная причина, по которой tmpfs используется даже сегодня, - это комментарий в моем / etc / fstab на моей коробке gentoo. КСТАТИ Хром не будет строить с отсутствующей линией:
# glibc 2.2 and above expects tmpfs to be mounted at /dev/shm for
# POSIX shared memory (shm_open, shm_unlink).
shm /dev/shm tmpfs nodev,nosuid,noexec 0 0
который вышел из документации ядра Linux
Цитирование:
tmpfs имеет следующие применения:
1) Всегда есть внутренняя монтировка ядра, которую вы вообще не увидите
. Это используется для общих анонимных сопоставлений и общей
памяти SYSV .
Это монтирование не зависит от CONFIG_TMPFS. Если CONFIG_TMPFS не установлен, видимая пользователем часть tmpfs не является сборкой. Но внутренние
механизмы всегда присутствуют.
2) glibc 2.2 и выше ожидает монтирования tmpfs в / dev / shm для
разделяемой памяти POSIX (shm_open, shm_unlink). Добавление следующей
строки в / etc / fstab должно позаботиться об этом:
tmpfs / dev / shm tmpfs по умолчанию 0 0
Не забудьте создать каталог, в который вы собираетесь монтировать tmpfs, если это необходимо.
Это монтирование не требуется для разделяемой памяти SYSV. Для этого используется внутреннее
крепление. (В версиях ядра 2.3 было
необходимо смонтировать предшественника tmpfs (shm fs) для использования
общей памяти SYSV )
3) Некоторые люди (включая меня) считают очень удобным монтировать его,
например, в / tmp и / var / tmp и иметь большой раздел подкачки. И теперь
монтирование цикла файлов tmpfs работает, поэтому mkinitrd, поставляемый большинством
дистрибутивов, должен успешно работать с tmpfs / tmp.
4) И, вероятно, многое другое, я не знаю о :-)
У tmpfs есть три варианта монтирования:
size: предел выделенных байтов для этого экземпляра tmpfs. По умолчанию половина вашей физической памяти без подкачки. Если вы увеличите размер экземпляров tmpfs, машина будет заблокирована, поскольку обработчик OOM не сможет освободить эту память.
nr_blocks: такой же, как размер, но в блоках PAGE_CACHE_SIZE.
nr_inodes: максимальное количество inode для этого экземпляра. Значение по умолчанию составляет половину от количества страниц физической памяти или (на компьютере с высоким значением) количество страниц с низким объемом памяти, в зависимости от того, что меньше.
Из прозрачного документа Hugepage Kernel Doc:
Прозрачная поддержка огромных страниц максимизирует полезность свободной памяти по сравнению с подходом резервирования hugetlbfs, позволяя использовать всю неиспользуемую память в качестве кэша или других подвижных (или даже неподвижных объектов). Не требуется резервирование, чтобы не допустить заметных сбоев при выделении огромных страниц из пользовательского пространства. Это позволяет пейджинг и все другие расширенные функции виртуальных машин быть доступными на огромных страницах. Это не требует никаких модификаций для приложений, чтобы воспользоваться этим.
Однако приложения могут быть дополнительно оптимизированы для использования этой функции, как, например, они были оптимизированы ранее, чтобы избежать потока системных вызовов mmap для каждого malloc (4k). Оптимизация пользовательского пространства является далеко не обязательной, и khugepaged уже может позаботиться о долгоживущем распределении страниц даже для приложений с огромными страницами, которые не работают с большим объемом памяти.
Новый комментарий после выполнения некоторых расчетов:
Размер огромной страницы: 2
МБ Используемые огромные страницы: Нет / Выкл, о чем свидетельствуют все 0, но включено, как указано выше, 2 МБ.
DirectMap4k: 8,03 ГБ
DirectMap2M: 16,5
ГБ DirectMap1G: 2 ГБ
Используя приведенный выше параграф, касающийся оптимизации в THS, похоже, что 8 ГБ вашей памяти используются приложениями, работающими с использованием malloc 4 КБ, 16,5 ГБ было запрошено приложениями, использующими malloc 2 МБ. Приложения, использующие mallocs из 2M, имитируют поддержку HugePage, выгружая секции 2M в ядро. Это предпочтительный метод, потому что как только ядро освобождает malloc, память освобождается для системы, в то время как монтирование tmpfs с использованием largepage не приведет к полной очистке, пока система не будет перезагружена. Наконец, самая простая, у вас было 2 открытых / запущенных программы, которые запрашивали malloc 1 Гб
Для тех из вас, кто не знает, что malloc - это стандартная структура в C, обозначающая ALLOCation в памяти. Эти расчеты служат доказательством того, что корреляция OP между DirectMapping и THS может быть правильной. Также обратите внимание, что монтирование HUGEPAGE ONLY fs приведет только к увеличению на 2 МБ, тогда как разрешение системе управлять памятью с использованием THS происходит в основном в блоках по 4 Кб, что означает, что с точки зрения управления памятью каждый вызов malloc сохраняет систему 2044 Кб (2048-4 ) для какого-то другого процесса, чтобы использовать.
/proc/meminfo
которые содержатHugePage
(или у вашей версии ядра их нет)? На какой это архитектуре (я полагаю, x86_64)?