Linux не використовує своп, але вбивця OOM спрацьовує


1

У мене ця проблема вже давно, і я, здається, не можу її зрозуміти, в основному моя система Linux (32bit 3.2.6-3.fc16.i686.PAE) відмовляється використовувати своп. Коли я біжу

$ tail /dev/zero
tail: memory exhausted

він взагалі не застосовує своп .. він просто гине після використання фізичної ОЗУ. Ось відповідні деталі.

$ free -m
             total       used       free     shared    buffers     cached
Mem:          8076       4652       3423          0        123        543
-/+ buffers/cache:       3985       4090
Swap:         8192        116       8076


$ cat /proc/sys/vm/swappiness 
60

$ ulimit -m
unlimited

$ cat /proc/sys/vm/overcommit_ratio
50

$ cat /proc/sys/vm/overcommit_memory 
0

Я спробував встановити його на 1:

# sysctl vm.overcommit_memory=1
vm.overcommit_memory = 1


$ cat /proc/sys/vm/overcommit_memory 
1

і спробував ще раз, той же результат. Якісь ідеї?


Чи допомагає ця відповідь? superuser.com/questions/561617/…
тинк

@tink не впевнений, чому я не бачив ваш коментар раніше, але я перевірив посилання, побачив vm.overcommit_memory=1рядок і просто перевірив, що в моїй системі було встановлено vm.overcommit_memory=0. Я щойно змінив його, і оновлю це питання, коли я знаю, чи це хитрість чи ні. Дякую!
божевільний

@tink, ну, я просто спробував, tail /dev/zeroі це не вийшло. Зміна все ще не використовується, але freeговорить мені, що заміна ввімкнена! Арг.
божевільний

Відповіді:


0

Це 32-бітний Linux, тому немає можливості виділити більше 4GiB пам’яті для програми, оскільки це вичерпає його адресний простір. У вас є 8GiB оперативна пам’ять, і вона в основному безкоштовна, тому 4096 MiB можна виділити без використання swap.


але якщо у мене є 3 Гб вільного фізичного барана, і я запускаю tail /dev/zeroйого, все-таки слід почати їсти в свопі, принаймні, для цього 1 ГБ додатково це дозволено перед тим, як вдарити згаданий вами обмеження 4 Гб, правда?
божевільний

Напевно ... Це має бути 32-бітна система. Насправді максимально дозволений адресний простір менше 3GiB через ядро ​​ОС. Тому спробуйте його на машині з 2GiB оперативної пам’яті.
ілхд

буде 2 ГБ вільної оперативної пам'яті працювати добре?
божевільний

Не впевнений. Слід, але в Linux ви ніколи не знаєте, скільки вільної пам'яті ви насправді маєте.
ilkhd

0

Це питання якесь старе, але є досить проста відповідь:

tailІнь від /dev/zeroне приносить користі. Якщо ви просто хочете потік нульових байтів, використовуйте cat.

tail(з параметрами за замовчуванням) поверне останні 10 рядків з аргументу. Оскільки /dev/zeroце символьний пристрій, воно почне читати з нього фрагменти даних до кінця (звичайні файли скануються назад). Зчитувані дані зберігаються, поки не знайдено 10 рядків, потім перші рядки будуть виведені з буфера.

Рядки будуть відокремлені символами нового рядка - \n. Оскільки /dev/zeroне повертає жодних нових рядків, усі дані (усі прочитані до цього часу нульові байти) як і раніше вважаються першим рядком і тому зберігаються в буфері. І tailтриватиме до тих пір, поки не знайдеться кінець файлу, що ніколи не відбудеться /dev/zero. Таким чином, ви ніколи не отримаєте корисного результату tail /dev/zero.

На щастя, ви маєте 32-бітну систему і маєте багато вільної пам’яті, тому пам'ять, доступна для одного процесу (як правило, 2 Гб, але може відрізнятися залежно від конфігурації ядра), вичерпується досить швидко і без заміни. команда перервана. Якщо ви спробуєте те ж саме в системі з меншою кількістю вільної пам'яті або більшим адресним простором (64-розрядна система), хвіст з’їсть всю пам'ять, яку він може отримати, змусіть ядро ​​максимально помінятися і, зрештою, ви все одно отримати помилку розподілу пам'яті. Або запустити вбивцю OOM. Але все ще немає нульових байтів у stdout.


Ваша відповідь потребує належного зображення Кодексу, ви намагаєтесь пояснити тут. Краще використовувати купу рядків, що містять виправлення, запропоновані ОП (Оригінальна публікація). Ви можете також посилатися на керівні рядки і про те, як скласти гарну відповідь.
Rajesh S
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.