Здійснення заміни для читання Linux назад в пам'ять


28

Ядро Linux замінює більшість сторінок з пам'яті, коли я запускаю програму, яка використовує більшість 16 Гб фізичної пам'яті. Після завершення програми кожна дія (введення команд, перемикання робочих просторів, відкриття нової веб-сторінки тощо) займає дуже багато часу, оскільки відповідні сторінки спочатку потрібно прочитати за допомогою swap.

Чи є спосіб сказати ядро ​​Linux скопіювати сторінки з підкачки назад у фізичну пам'ять, не торкаючись вручну (і чекаючи) кожної програми? Я запускаю безліч додатків, тому очікування завжди болісне.

Я часто використовую swapoff -a && swapon -aдля того, щоб система знову відповідала, але це очищає сторінки від свопінгу, тому їх потрібно писати ще раз наступного разу, коли я запускаю сценарій.

Чи є інтерфейс ядра, можливо, використовуючи sysfs, щоб доручити ядру читати всі сторінки з підкачки?

Редагувати: Я дійсно шукаю спосіб зробити все свопом заміненим. (Дякую дероберт!)

[PS serverfault.com/questions/153946/… та serverfault.com/questions/100448/… - це пов’язані теми, але вони не стосуються питання, як отримати ядро ​​Linux для копіювання сторінок із своп назад в пам'ять без очищення swap.]


Ви хочете, щоб усі свопи були кешем пам'яті системи? Отже, ви хочете зображення пам'яті системи, яке ви можете перезавантажити за бажанням? Це в основному, як працює сплячка - система зображує свою пам'ять на диску, вимикається та відновлює зображення при включенні живлення. Чи є, на вашу думку, шанс, що на запит, що слідує за цією темою, може бути корисним вам? Наприклад, якби ви зобразили свою пам’ять, відключили swap, виконали завдання, потім відновіть зображення і повторіть - це те, що ви могли б хотіти зробити?
mikeserv

Я не думаю, що це не залишить своп у стані, що змінюється. Як таке, мені здається, що ваша пропозиція є альтернативою методу swapoff-swapon.
drrossum

Ні, він не кешує своп (що, правда, мені трохи дивно), він кешує оперативну пам’ять у якийсь момент, який ви вважаєте найбільш інтегральним, а потім присвячує всю системну пам'ять якомусь інтенсивному завданню, перш ніж відновити кеш, коли завдання наскрізь. Якщо ви хочете робити обмін під час інтенсивного завдання, тоді ви лише сповільнюватимете завдання - вам знадобиться додатковий час, щоб поміняти сторінки під час подальшої роботи.
mikeserv

Відповіді:


4

На основі спочатку встановленої тут програми memdump я створив сценарій для вибіркового читання заданих програм назад у пам'ять. :remember

#!/bin/bash
declare -A Q
for i in "$@"; do
    E=$(readlink /proc/$i/exe);
    if [ -z "$E" ]; then.
        #echo skipped $i;.
        continue;.
    fi
    if echo $E | grep -qF memdump; then.
        #echo skipped $i >&2;.
        continue;.
    fi
    if [ -n "${Q[${E}]}" ]; then.
        #echo already $i >&2;.
        continue;.
    fi
    echo "$i $E" >&2
    memdump $i 2> /dev/null
    Q[$E]=$i
done | pv -c -i 2 > /dev/null

Використання: щось подібне

# ./remember $(< /mnt/cgroup/tasks )
1 /sbin/init
882 /bin/bash
1301 /usr/bin/hexchat
...
2.21GiB 0:00:02 [ 1.1GiB/s] [  <=>     ]
...
6838 /sbin/agetty
11.6GiB 0:00:10 [1.16GiB/s] [      <=> ]
...
23.7GiB 0:00:38 [ 637MiB/s] [   <=>    ]
# 

Він швидко пропускає через незамінену пам'ять (гігабайти в секунду) і сповільнюється, коли потрібен своп.


Цей інструмент робить саме те, що я шукав. Спасибі!
drrossum

Одне приємне - це те, що, з мого спостереження, розміщені сторінки копіюються в оперативну пам’ять, але вони не видаляються зі свопу (принаймні, більшість з них немає, тому що використання swap лише незначно зменшується). Моя інтерпретація полягає в тому, що Linux зберігає дві копії кожної сторінки, одну в оперативній пам’яті та одну в свопі. Якщо це обробляється правильно, це навіть краще, ніж скасовувати та додавати swap знову, оскільки це означає, що, коли подвійну сторінку доведеться знову поміняти, не буде потреби в іншій копії. Дякуємо будь-якому експерту з ядра, який може підтвердити.
Джованні Масселлані

11

Це може допомогти збільшити /proc/sys/vm/page-cluster(за замовчуванням: 3).

З документації на ядро ​​( sysctl/vm.txt):

сторінка-кластер

сторінка-кластер контролює кількість сторінок, до яких читаються послідовні сторінки за допомогою однієї спроби. Це аналог свопінгу для перечитання кешу сторінок. Згадана послідовність не з точки зору віртуальних / фізичних адрес, а послідовна в просторі своп - це означає, що вони були замінені разом.

Це логарифмічне значення - встановити його в нуль означає "1 сторінку", встановити його на 1 означає "2 сторінки", встановити його на 2 означає "4 сторінки" і т. Д. Нуль повністю відключає swap readadahead повністю.

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

Більш низькі значення означають менші затримки для початкових несправностей, але в той же час додаткові помилки та затримки вводу / виводу для наступних несправностей, якби вони були частиною цих перезавантажених сторінок.

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


Це звучить як корисне рішення. Два вручну втручання можна поєднувати з командою сну, щоб зробити це одним втручанням користувача. Але, можливо, не обов'язково робити всі свопи заміни дуже швидко, оскільки вони читаються лише послідовно зі сторінки, до якої можна отримати доступ. Хоча це найкраще рішення поки що. Спасибі!
drrossum

tbh, це, мабуть, найкраще рішення, яке ви збираєтеся отримати. Я не чув про нього раніше, але схоже, що це перетворює своп в серію великих ВГД, а не суцільний набір невеликих ВГД, що, мабуть, є причиною ваших проблем з продуктивністю. Я був би законно здивований, якби щось, що ідеально вирішило вашу індивідуальну ситуацію.
Братчлі

З цього питання, якщо у вас спостерігаються уповільнення через безліч послідовних невеликих підкачок, навіть просто постійне коригування page-clusterзначення може підвищити ефективність.
Ільмарі Каронен

5

Ви можете спробувати додати програми, які вас найбільше хвилюють, до групи та налаштувати свобідність, щоб наступного разу програма запустити додані вами програми, менше шансів стати кандидатами на заміну.

Деякі їх сторінки, ймовірно, все-таки будуть замінені, але це може усунути ваші проблеми з продуктивністю. Значна частина цього, мабуть, є лише поведінкою "зупинити і почати", коли багато сторінок програми знаходяться в обміні, і програма повинна постійно робити паузи, щоб поміняти свої сторінки в оперативну пам'ять, але лише з кроком 4 к.

Крім того, ви можете додати застосовану програму до групи та налаштувати свобідність, щоб програма була тією, яка має тенденцію найбільше використовувати файл swap. Це уповільнить додаток, але це пошкодить решту системи.


4

Мені здається, що ти не можеш магічно "змусити систему реагувати знову". Ви або несете штраф або читаєте сторінки назад із місцями для заміни місця в пам’яті, або ви переносите його пізніше, але так чи інакше ви несете його. У самому справі, якщо ви робите що - щось на зразок , swapoff -a && swapon -aто ви можете відчувати більше болю , а не менше, тому що ви змушуєте кілька сторінок , щоб бути скопійовані назад в пам'ять , що б в іншому випадку не було необхідності знову і в кінці кінців впав без читання (думаю , ви вийти з програми той час як значна частина його купи заміщена; ці сторінки можна взагалі викинути, не повертаючись до пам'яті).

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

Ну, майже будь-яка сторінка, яка копіюється назад із своп у основну пам'ять, все одно буде змінена, тому, якщо її в майбутньому потрібно буде перенести знову, щоб змінити її в майбутньому, вона все одно повинна бути записана за допомогою swap. Майте на увазі, що своп - це в основному накопичувальна пам'ять, а не сторінки лише для читання (які зазвичай підтримуються файлами).

Я думаю, що твій swapoff -a && swapon -aфокус такий же хороший, як і все, що ти можеш придумати.


Ось ми двоє одночасно говоримо абсолютно те саме;)
goldilocks

@goldilocks Так, я бачив, що ваша відповідь з’явилася ще до того, як моя була готова, але я вже був ¾ зроблений, тому я затримався з цим :-)
Целада

Ви і золотарки говорите одне і те ж, але я не вірю, що так працює кеп підміна. Я розумію, що ви можете мати сторінки в swap І пам'яті одночасно. Сторінка своп стає недійсною лише після оновлення сторінки в пам'яті.
drrossum

Я вірю, що відповідь, на яку ви посилалися Девід Спіллет, є правильною: ви дійсно можете мати сторінку в свопі і оперативній пам’яті одночасно ... але тільки до моменту, поки версія RAM не буде змінена. Тоді вам доведеться відкинути застарілу копію свопом. Коли я сказав: "майже будь-яка сторінка, яка копіюється назад із свопом [...], все одно буде змінена", я маю на увазі, що я очікую, що саме це відбувається більшу частину часу, тому я не чекаю, що сторінки в обох місцях бути значною часткою, про яку варто потурбуватися.
Селада

Ваш сценарій використання може бути різним: у вас може бути багато додатків з великою групою, які часто читаються і не пишуться. Моє відчуття, що у більшості людей немає такого сценарію. Але якщо так, то, мабуть, ти маєш рацію: swapoff -a && swapon -aне буде тобі добре. Я думаю, що в цьому випадку вам знадобиться щось, що сканує /proc/<each-process>/memі читає кожну сторінку пам'яті, щоб переконатися, що вона існує в оперативній пам'яті. Не знаю, чи існує.
Селада

0

Тут є дуже приємна дискусія http://rudd-o.com/en/linux-and-free-software/tales-from-responsivenessland-why-linux-feels-slow-and-how-to-fix-that що зводиться до зменшення свобідності, з думкою, що для збільшення сприйнятої чутливості системи слід запобігати заміні коду (і саме це відбувається). Це насправді не є відповіддю на ваше запитання, але це може запобігти появі проблеми (ваші програми просто не замінюються, лише невикористані дані та кеш сторінок)


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