Коли я повинен використовувати / dev / shm / і коли я повинен / tmp /?


139

Коли я повинен використовувати /dev/shm/і коли слід використовувати /tmp/? Чи можу я завжди розраховувати на те, що вони знаходяться там у Unice?

Відповіді:


101

/dev/shmє тимчасовою файловою системою зберігання файлів, тобто tmpfs , яка використовує оперативну пам’ять для резервного сховища. Він може функціонувати як реалізація спільної пам'яті, що полегшує IPC .

З Вікіпедії :

Останні версії 2.6 ядра Linux почали пропонувати / dev / shm як спільну пам'ять у вигляді ramdisk, точніше як всесвітньо доступний каталог, який зберігається в пам'яті з визначеним обмеженням в / etc / default / tmpfs.  / dev / shm підтримка є абсолютно необов'язковою у файлі конфігурації ядра.   Він включений за замовчуванням як у дистрибутивах Fedora, так і в Ubuntu, де найбільш широко використовується додатком Pulseaudio.             (Наголос додано.)

/tmp- це місце для тимчасових файлів, визначених у стандарті ієрархії файлової системи , за яким супроводжуються майже всі дистрибутиви Unix та Linux.

Оскільки оперативна пам’ять значно швидша, ніж дискове зберігання, ви можете використовувати /dev/shmзамість /tmpпідвищення продуктивності , якщо ваш процес інтенсивно вводить-виводить і широко використовує тимчасові файли.

Щоб відповісти на ваші запитання: Ні, ви не завжди можете розраховувати на /dev/shmприсутність, звичайно, не на машини, зав'язану для пам'яті. Ви повинні використовувати, /tmpякщо у вас немає дуже вагомих причин для використання /dev/shm.

Пам’ятайте, що /tmpможе бути частиною /файлової системи замість окремого кріплення, а значить, може зростати у міру необхідності. Розмір /dev/shmобмежений надлишком оперативної пам’яті в системі, отже, у вас більше шансів на те, що у цій файловій системі не вистачить місця.


1
Я буду використовувати його для перенаправлення виводу зі стандартного виводу помилки команд у файл. Потім я прочитаю цей файл і обробляю його. Я буду робити це кілька тисяч разів (це частина умови контурної конструкції). Я думав, що в цьому випадку пам'ять буде добре. Але я також хочу, щоб це було портативним. Я думаю, я перевіряю, чи /dev/shmіснує, використовувати його, якщо він є, або резервний /tmp. Це добре звучить?
Видалено

1
Я також додам чек на мінімальний розмір та поточний рівень використання / dev / shm, щоб захистити його від ненавмисного заповнення.
nagul

4
У Linux 2.6 та пізніших версіях / dev / shm потрібно встановити, щоб виклики системи спільної пам'яті POSIX, як shm_open (), працювали. Іншими словами, деякі програми зламаються, якщо його не встановлено - так і має бути. Це не просто диск RAM. Тому ви повинні переконатися, що частина / dev / shm є безкоштовною.
EdH

7
Немає підвищення продуктивності за допомогою /dev/shm. /dev/shm- це пам'ять (tmpfs), яку підтримує диск (своп). /var/tmpце пам'ять (дисковий кеш), що підтримується диском (файлова система на диску). На практиці продуктивність приблизно однакова (tmpfs має незначну перевагу, але недостатня для значення). /tmpможе бути tmpfs або не залежно від того, як налаштував його адміністратор. Немає вагомих причин використовувати /dev/shmу своїх сценаріях.
Жиль

3
@GaretClaborn Існує маса вагомих причин використовувати пам'ять, підкріплену свопом, але це називається звичайною процесорою. Якщо ви використовуєте файл, він називається файловою системою, а всі файлові системи - це пам'ять (кеш), яка підтримується свопом, якщо файлова система є чимось на зразок tmpfs. Розподіл дискового простору між свопом та іншими областями зберігання, як правило, є справжнім для адміністратора. Якщо програма хоче, щоб файли, які, як правило, залишалися в оперативній пам’яті, /tmpце нормальне розташування (з $TMPDIRпереопрацюванням). Вибір зробити /tmpпідкріплений свопом, іншим дисковим простором або нічого не є рішенням адміністратора.
Жиль

61

У порядку зменшення tmpfsймовірності:

┌───────────┬──────────────┬────────────────┐
│ /dev/shm  │ always tmpfs │ Linux specific │
├───────────┼──────────────┼────────────────┤
│ /tmp      │ can be tmpfs │ FHS 1.0        │
├───────────┼──────────────┼────────────────┤
│ /var/tmp  │ never tmpfs  │ FHS 1.0        │
└───────────┴──────────────┴────────────────┘

Оскільки ви запитуєте про конкретну точку монтування tmpfs для Linux, а не про портативно визначений каталог, який може бути tmpfs (залежно від вашого sysadmin та того, що визначено для вашого дистрибутива), у вашого запитання є два аспекти, на які інші відповіді підкреслюють по-різному:

  1. Коли використовувати ці каталоги, грунтуючись на належній практиці
  2. Коли доречно використовувати tmpfs

Належна практика

Консервативне видання (суміш конвенцій FHS та загального користування):

  • Коли ви сумніваєтесь, використовуйте /tmp.
  • Використовуйте /var/tmpдля великих даних, які можуть не легко вписатись у таран.
  • Використовуйте /var/tmpдля даних, які вигідно зберігати через перезавантаження (як кеш).
  • Використовувати /dev/shmяк побічний ефект дзвінка shm_open(). Передбачувана аудиторія - це обмежені буфери, які нескінченно переписуються. Отже, це файли для довгожителів, вміст яких є непостійним і не дуже великим.
  • Якщо ви все ще сумніваєтеся, надайте користувачеві спосіб перекриття. Наприклад, mktempпрограма вшановує TMPDIRзмінну середовища.

Прагматичне видання:

Використовуйте, /dev/shmколи важливо використовувати tmpfs, /var/tmpколи важливо не робити, інше /tmp.

Де tmpfs перевершує

fsyncє необов’язковим для tmpfs. Цей системний виклик є ворогом номер один (IO) продуктивності (і спалах довголіття, якщо вам це важливо), хоча якщо ви опинитесь за допомогою tmpfs (або eatmydata) просто щоб перемогти fsync, тоді ви (або якийсь інший розробник у ланцюжку) робите щось не так. Це означає, що транзакції на накопичувальний пристрій надмірно чітко визначені для вашої мети - ви, очевидно, готові пропустити деякі точки збереження для продуктивності, так як зараз ви перейшли до крайньої можливості саботувати їх усі - рідко найкращий компроміс. Крім того, саме тут, на землі для виконання транзакцій, є одні з найбільших переваг наявності SSD - будь-який гідний SSD буде виконуватись поза цим світом, порівняно з тим, що може зайняти спінінг-диск (7200 об / хв = 120 Гц , якщо сповіщення іншого доступу до нього), не кажучи вже про карти флеш-пам’яті, які сильно різняться в цій метриці (не в останню чергу тому, що це компроміс із послідовною продуктивністю, якою вони оцінюються, наприклад, рейтинг класу SD карт). Тож будьте обережні,

Хочете почути смішну історію? Мій перший fsyncурок: у мене була робота, яка передбачала звичайне "оновлення" купи баз даних Sqlite (зберігається як тестові шафи) до постійно змінюваного поточного формату. Рамка "оновлення" запускає купу сценаріїв, здійснюючи принаймні одну транзакцію для оновлення однієї бази даних. Звичайно, я модернізував свої бази даних паралельно (8 паралельно, оскільки мене поблажив могутній 8 ядерний процесор). Але, як я з'ясував, прискорення паралелізації не було (швидше, невеликий удар ), оскільки процес був повністю пов'язаний з IO. Весело, загортання рамки оновлення у сценарій, який скопіював кожну базу даних /dev/shm, модернізував її та скопіював її назад на диск, був як у 100 разів швидшим (все ще з 8 паралельно). Як бонус, ПК був корисним також під час оновлення баз даних.

Там, де підходить tmpfs

Відповідне використання tmpfs полягає у тому, щоб уникнути зайвого запису летких даних. Ефективно відключення зворотного запису , як установка /proc/sys/vm/dirty_writeback_centisecsна нескінченність на регулярній файлової системи.

Це має дуже мало спільного з продуктивністю, і, якщо цього не зробити, це набагато менший занепокоєння, ніж зловживання fsync: час очікування відтворення визначає, наскільки ліниво оновлюється вміст диска після вмісту сторінки кеш-пам'яті, а за замовчуванням 5 секунд - це довгий час для комп'ютера - програма може перезаписувати файл у сховищі сторінок так часто, як хоче, але вміст на диску оновлюється лише раз на 5 секунд. Якщо додаток не змушує його за допомогою fsync, тобто. Подумайте про те, скільки разів програма може вивести невеликий файл за цей час, і ви бачите, чому синювання кожного окремого буде набагато більшою проблемою.

Що tmpfs не може вам допомогти

  • Прочитайте виставу. Якщо ваші дані гарячі (що краще, якщо ви вирішите зберігати їх у форматі tmpfs), ви все одно потрапите в кеш сторінки. Різниця полягає в тому, коли не потрапляє кеш сторінки; якщо це так, перейдіть до "Де tmpfs sux", нижче.
  • Короткі файли. Вони можуть прожити все своє життя в кеш-пам’яті сторінок (як брудні сторінки), перш ніж виписуватись. Якщо, fsyncзвичайно, не примусиш.

Де tmpfs sux

Зберігання холодних даних. Можливо, вам сподобається думати, що подання файлів поза свопом так само ефективно, як і звичайна файлова система, але є кілька причин, чому це не так:

  • Найпростіша причина: сучасні пристрої зберігання даних (будь то жорсткий диск або флеш-пам’ять) не люблять більше, ніж читання досить послідовних файлів, акуратно організованих відповідною файловою системою. Обмін блоками 4KiB навряд чи покращиться.
  • Прихована вартість: Перестановка з . Сторінки Tmpfs забруднені - їх потрібно кудись записати (поміняти місцями), щоб вилучити їх із кеш-сторінки, на відміну від файлів із резервними чистими сторінками, які можна миттєво скинути. Це додаткове покарання за все, що конкурує за пам'ять - впливає на щось інше в інший час, ніж використання цих сторінок tmpfs.

У моєму ubuntu 14.04 / dev / shm є посиланням на / run / shm, що має файлову систему "none" згідно з командою df. Хоча розмір приблизно 2G.
jarno

3
@jarno По-перше, заощаджуючи кількість точок кріплення tmpfs, я б назвав детальну інформацію про реалізацію. По-друге, не дозволяйте назву пристрою вас бентежити - загляньте в / proc / mounts (це правильне місце для пошуку), і ви побачите, що тип "tmpfs", тоді як пристрій тут "жоден". Так, назва пристрою нічого не означає в tmpfs - ви можете, mount -t tmpfs "jarno is great" /mnt/jarnoякщо хочете! По-третє, розмір за замовчуванням - це половина обсягу оперативної пам’яті.
user2394284

1
Чи є варіант, який виділяє фіксований розмір оперативної пам’яті і обіцяє ніколи не використовувати своп?
palswim

@palswim: Це був би рамковий диск. Я не бачу варіанту для цього в tmpfs , крім того, що попередник tmpfs не підтримував заміну. Процеси можуть заблокувати свої сторінки в операційній пам’яті, що, мабуть, менш божевільно, ніж заблокувати сторінки tmpfs в операційній пам’яті, враховуючи, що вбивця OOM не в змозі звільнити останню, якщо вам не вистачить пам’яті.
user2394284

18

Гаразд, ось реальність.

І tmpfs, і звичайна файлова система - це кеш пам'яті на диску.

Tmpfs використовує пам'ять і swapspace, оскільки він підтримує зберігання файлової системи, яка використовує певну область диска, не обмежена розміром, якою може бути файлова система, цілком можливо мати 200 ГБ tmpfs на машині з меншим ГБ оперативної пам'яті, якщо у вас достатньо простору.

Різниця полягає в тому, коли дані записуються на диск. Для tmpfs дані записуються ТІЛЬКИ, коли пам'ять стає занадто повною або дані навряд чи будуть використані незабаром. Найбільш звичайні файлові системи Linux OTOH призначені для того, щоб завжди мати більш-менш послідовний набір даних на диску, тому якщо користувач витягне плагін, вони не втратять усе.

Особисто я звик мати операційні системи, які не виходять з ладу та системи ДБЖ (наприклад, батареї ноутбука), тому я думаю, що файлові системи ext2 / 3 занадто параноїдальні з інтервалом контрольної точки 5-10 секунд. Файлова система ext4 краще з 10-хвилинною контрольною точкою, за винятком того, що вона розглядає дані користувачів як другий клас і не захищає їх. (ext3 те саме, але ви цього не помічаєте через 5-секундної контрольної точки)

Ця часта контрольна точка означає, що зайві дані постійно записуються на диск, навіть для / tmp.

Таким чином, результат - вам потрібно створити розмір простору розміру, який вам потрібен / tmp (навіть якщо вам доведеться створити swapfile) і використовувати цей простір для монтажу tmpfs потрібного розміру на / tmp.

НІКОЛИ не використовуйте / dev / shm.

Якщо ви не використовуєте його для дуже малих (можливо, mmap'd) IPC-файлів, і ви впевнені, що він існує (це не стандарт), і на апараті є більш ніж достатньо пам'яті + підміна.


24
Погодили, крім висновку, "НІКОЛИ не використовуйте / dev / shm". Ви хочете використовувати / dev / shm у тих випадках, коли ви взагалі не хочете записувати файл на диск і хочете мінімізувати введення / виведення диска. Наприклад, мені потрібно завантажити дуже великі поштові файли з FTP-сервера, розпакуйте їх, а потім імпортуйте в базу даних. Я розпаковую до / dev / shm, щоб і для операцій разархівування, і для імпорту HDD потрібно було виконати лише половину операції, а не переміщення вперед-назад між джерелом та пунктом призначення. Це прискорює процес надзвичайно. Це один із прикладів багатьох, але я згоден, що це інструмент ніші.
Натан Стретч

4

Використовуйте / tmp / для тимчасових файлів. Використовуйте / dev / shm / тоді, коли потрібно спільну пам'ять (тобто міжпроцесорне спілкування через файли).

Ви можете розраховувати на / tmp / перебування там, але / dev / shm / є відносно недавнім лише Linux.


Чи немає також аспекту продуктивності? Як / dev / shm найчастіше монтується як об'єм tmpfs і по суті є RAM-диском?
Видалено

Ви також можете монтувати / tmp як файлову систему tmpfs, я роблю це в моєму нетбуці, щоб прискорити деякі речі, зменшивши запис на (повільний) SSD. Звичайно, в цьому є і недоліки (в основному використання оперативної пам’яті, але мій нетбук має набагато більше оперативної пам’яті, ніж це взагалі потрібно).
Девід Спіллетт

У моєму конкретному випадку я використовував би це для свого роду комунікаційного процесу. Я фіксую вихід стандартної помилки з програми та дію на вміст (і мені все ще потрібен стандартний вихід недоторканим, тому я не можу робити жодного 1>/dev/null 2>&1. Я зробив би це кілька тисяч разів, тому tmpfs було б непогано. Однак, якщо я випустити скрипт, я не можу покластися на те, що використовується tmpfs, /tmpоскільки я думаю, що це не так часто. Якщо це більше звичне, /dev/shmтоді для мене це краще. Але я шукаю вказівки щодо переносимості тощо
Видалено

1

Інший раз, коли вам слід використовувати / dev / shm (для Linux 2.6 і вище), коли вам потрібна гарантована файлова система tmpfs, оскільки ви не знаєте, чи можете ви записати на диск.

Система моніторингу, з якою я знайомий, повинна виписувати тимчасові файли під час створення звіту для подання на центральний сервер. На практиці набагато ймовірніше, що щось заважатиме записувати у файлову систему (або з дискового простору, або через основну помилку RAID підштовхнув систему до апаратного режиму лише для читання), але ви все одно зможете кульгати, щоб сповістити про це, ніж якщо щось спіралює всю наявну пам'ять, так що tmpfs буде непридатним (і поле не буде мертвим). У таких випадках система моніторингу віддасть перевагу виписуванню в оперативну пам’ять, щоб потенційно мати можливість надсилати сповіщення про повний диск або апарат загиблих / вмираючих.


0

/ dev / shm використовується для спільних специфічних драйверів пристроїв та програм для віртуальної пам'яті.

Якщо ви створюєте програму, для якої потрібна купа віртуальної пам'яті, яку слід відобразити у віртуальній пам'яті. Це подвоюється, якщо вам потрібно безліч процесів або потоків, щоб безпечно отримати доступ до цієї пам'яті.

Справа в тому, що те, що драйвер використовує для нього спеціальну версію tmpfs, не означає, що ви повинні використовувати його як загальний розділ tmpfs. Натомість слід просто створити інший розділ tmpfs, якщо він потрібен для вашої тимчасової директорії.


0

У PERL, маючи мінімум 8 ГБ на будь-якій машині (на всіх Linux Linux Mint), я вважаю, що це гарна звичка робити складні алгоритми на основі DB_File (структура даних у файлі) з мільйонами читання та запису за допомогою / dev / шм

Іншими мовами, не маючи скрізь gigether, щоб уникнути запусків і зупинок у передачі мережі (локально працюючи над файлом, який знаходиться на сервері в атмосфері клієнт-сервер), використовуючи пакетний файл певного типу, я скопіюю весь (300-900MB) файл одразу до / dev / shm, запустіть програму з виведенням у / dev / shm, запишіть результати на сервер та видаліть з / dev / shm

Природно, якби у мене було менше оперативної пам’яті, я б цього не робив. Зазвичай файлова система в пам'яті / dev / shm читається як розмір, що становить половину вашої доступної оперативної пам’яті. Однак звичайне використання оперативної пам’яті є постійним. Таким чином, ви дійсно не могли цього зробити на пристрої з 2 Гб або менше. Щоб перетворити парафрази на гіперболи, часто в оперативній пам'яті трапляються речі, про які навіть система не надто добре повідомляє.


(Я думаю, що це в дусі того, що спочатку запитували.) Я в основному маю на увазі те, що мені зручно використовувати / dev / shm як диск оперативної пам’яті, доки у мене є достатня кількість пам’яті. Якщо це зробити неефективно, то це не повинно відмовити вас від цього, але повинно викликати питання на кшталт "Як я можу мати операційний диск на Linux?". Відповідь / dev / shm
David Grove
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.