Буферний кеш

В операційній системі Linux більше немає окремого буферного кешу У ядрах серії 22 існувало два окремих кешу: сторінковий і буферний У першому кешіроваліси сторінки памяті, а в іншому – Буфери Ці два кеш-памяті не були обєднані між собою Дисковий блок міг перебувати в обох кешах одночасно Це вимагало великих зусиль по синхронізації двох кешованих копій, що не кажучи вже про марної витрати памяті

Так було в ядрах серії 22 і більш ранніх, але починаючи з ядер Linux серії 24

обидва кеша обєднали разом Сьогодні існує тільки один дисковий кеш – сторінковий кеш

Ядру все ще необхідно використовувати буфери для того, щоб представляти дискові блоки в памяті На щастя, буфери описують відображення блоків на сторінки памяті, які в свою чергу знаходяться в сторінковому кеші

Демон pdflush

Змінені (dirty, брудні) сторінки памяті коли-небудь повинні бути записані на диск Зворотній запис сторінок памяті виконується в наступних двох випадках

• Коли обєм вільної памяті стає менше певного порогу, ядро ​​повинно записати змінені дані назад на диск, щоб звільнити память

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

Ці два типи записи мають різні цілі У більш старих ядрах вони виконувалися двома різними потоками простору ядра (див наступний розділ) Однак в ядрі

26 цю роботу виконує група (gang4) потоків ядра pdflush, які називаються демонами фонової зворотного запису (або просто потоками pdflush) Ходять чутки, що назва pdflus h – це скорочення від dirty page flush (Очищення брудних сторінок) Не звертайте увагу на це сумнівне назву, давайте краще більш детально розглянемо, для чого потрібні ці процеси

По-перше, потоки pdflus h служать для запису змінених сторінок на диск, коли обсяг вільної памяті в системі зменшується до певного рівня Мета такої фонового запису-звільнення памяті, яку займають незаписані сторінки, в разі нестачі фізичних сторінок памяті Рівень, коли починається зворотній запис, може бути налаштований за допомогою параметра dir ty_background_rati o утиліти sysctl Коли обєм вільної памяті стає менше цього порогу, ядро ​​викликає функцію wakeup_bdf lus h () 5 для перекладу в стан виконання потоку pdflush, який пиполняет функцію зворотного записи змінених сторінок памяті background_writeou t () Ця функція отримує один параметр, що дорівнює кількості сторінок, які функція повинна спробувати записати на диск

Функція продовжує запис до тих пір, поки не виконаються два наступних умови

• Зазначене мінімальна кількість сторінок записано на диск

• Обсяг вільної памяті перевищує відповідне значення параметра dirty_background_ratio

Виконання цих умов гарантує, що демон pdf lus h виконав свою роботу щодо запобігання браку памяті Якщо ці умови не виконуються, то зворотний запис може зупинитися тільки тоді, коли демон pdflus h запише на диск всінезбережені сторінки і для нього більше не буде роботи

По-друге, призначення демона pdflus h – періодично переходити в стан виконання (незалежно від стану брак памяті) і записувати на диск дуже

4 Слово gang НЕ являетс я жаргонним Цей термі н часто використовується в компютерних науках, щоб вказати групу чого-небудь, що може виконуватися паралельно

5Да, назва функції не зовсім вірне Повинн про було б бути wakeup_pdflush  ()  У наступному розділі розказано, звідки походить це назва

давно змінені сторінки памяті Це гарантує, що змінені сторінки не будуть перебувати в памяті невизначений час При збоях системи будуть втрачені ті сторінки памяті, що не були збережені на диску, так як вміст памяті після перевантаження не зберігається Отже, періодична синхронізація сторінкового кеша з даними на диску є важливою справою При завантаженні системи инициализируется таймер, періодично повертає до виконання потік pdflush, який виконує функцію wb_kupdat e () Ця функція виконує зворотну запис даних, які були змінені більш ніж dirty_expire_centi seс s сотих секунди тому Після цього таймер знову инициализируется, щоб спрацювати через dirty_expire_centisec s сотих секунди Таким чином потоки pdflus h періодично повертаються до виконання і записують на диск всі змінені сторінки, дані в яких старше, ніж зазначений ліміт

Системний адміністратор може встановити ці значення за допомогою каталогу

/ Proc / sys / vr n і утиліти sysctl Втабл 151 наведено список всіх відповідних змінних

Таблиця 151 Параметри для налаштування демона pdflus h

Мінлива Опис

dirty_background_ratio dirty_expire_centisecs

dirty_ratio dirty_writeback_centisecs

laptop_mode

Обсяг вільної оперативної памяті, при якому демон pdflus h починає зворотний запис незаписаних даних

Час, в сотих долях секунди, протягом якого незаписані дані можуть залишатися в памяті, перед тим як демон pdflus h НЕ запише їх на диск при наступному періоді зворотного запису

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

•  •  i

Наскільки часто, в сотих долях секунди, процес bdflus h

повертається до виконання для зворотного запису даних

Мінлива булевого типу, яка включає або вимикає режим ноутбука (див наступний розділ)

Код потоку pdflus h знаходиться в файлу х mm / page-writeback c і fs /

fs-writebackс

Режим ноутбука

Режим ноутбука – це спеціальна політика зворотного запису сторінок з метою оптимізації використання батареї і продовження терміну її роботи Це робиться шляхом мінімізації активності жорстких дисків, щоб вони залишалися в зупиненому стані по можливості довго Конфігурувати цей режим можна за допомогою файлу / proc / sys / vm / laptop_mode За умовчанням в цьому файлі записано значення 0 і режим ноутбука вимкнений Запис значення 1 в цей файл дозволяє включити режим ноутбука

У режимі ноутбука існує всього одна зміна у виконанні зворотного запису сторінок На додаток до зворотного запису змінених сторінок памяті, коли вони стають досить старими, демон pdflus h також виконує і всі інші операції дискового введення-виведення, записуючи всі дискові буфери на

диск Таким чином демон pdflus h користується тим перевагою, що диск вже запущений, а також він гарантує, що в найближчому майбутньому диск знову запущений не буде

Така поведінка має сенс, коли параметри dirty_expire_centisec s і dirty_writeback_centisec s встановлені в великі значення, скажімо 10 хвилин При таких затримках зворотного запису диск запускається не часто, а коли він все-таки запускається, то робота в режимі ноутбука гарантує, що цей момент буде використаний з максимальною ефективністю

У багатьох поставках ОС Linux режим ноутбука автоматично включається і вимикається, при цьому також можуть змінюватися і інші параметри демона pbflush, коли заряд батареї зменшується Така поведінка дозволяє отримувати переваги від режиму ноутбука при роботі від батареї і автоматично повертатися до нормального поведінки, коли машина включається в електричну мережу

Демониbdflushіkupdated

У ядрах серій до 26 робота потоків pdflus h виконувалася двома іншими потоками ядра bdflus h і kupdated

Потік простору ядра bdflus h виконував фонову зворотну запис змінених сторінок, коли кількість доступної памяті ставало досить малим Також було визначено низку порогових значень, аналогічно тому як це робиться для демона pdflush Демон bdflus h повертався до виконання за допомогою функції wakeup_bdflus h (), коли кількість вільної памяті ставало менше цих порогових значень

Між демонами bdflus h і pdflus h існує два головних відмінності Перше полягає в тому, що демон bdflus h був всього один, а кількість потоків pdflus h може змінюватися динамічно Про це більш докладно буде розказано в наступному розділі Друга відмінність полягає в тому, що демон bdflus h працював з буферами, він записував на диск змінені буфери Демон pdflus h працює зі сторінками, він записує на диск цілі змінені сторінки памяті Звичайно, сторінки памяті можуть відповідати буферам, але одиницею введення-виведення є ціла сторінка памяті, а не один буфер Це дає перевагу, оскільки працювати зі сторінками памяті простіше, ніж з буферами, так як сторінка памяті – більш загальний і більш часто використовуваний обєкт

Так як демон bdflus h виконував зворотну запис, тільки коли кількість вільної памяті дуже сильно зменшувалася або кількість буферів було дуже великим, то був введений потік ядра kupdated , Який періодично виконував зворотну запис змінених сторінок памяті Він використовувався для цілей, аналогічних функції wb_kupdat e () демона pdflush

Потоки bdflus h і kupdate d і їх функціональність зараз замінені потоками pdflush

Запобігання перевантаженості:

для чого потрібні декілька потоків

Один з головних недоліків рішення на основі демона bdflus h полягає в тому, що демон bdflus h мав всього один потік виконання Це призводило до можливості зависання демона при великому кількості операцій зворотного запису, коли

один потік демона bdflus h блокувався на черзі запитів вводу-виводу перевантаженого пристрої, в той час як черги запитів інших пристроїв могли бути в цей момент порівняно вільними Якщо система має кілька дисків і відповідну процесорну потужність, то ядро ​​повинно мати можливість завантажити роботою всі диски На жаль, навіть при великій кількості даних, для яких необхідна зворотний запис, демон bdflus h може виявитися завантаженим роботою з однією чергою і не зможе підтримувати всі диски в навантаженому стані Це відбувається тому, що пропускна здатність диском конечна і, до нещастя, дуже низька Якщо тільки один потік виконує зворотну запис сторінок, то він може проводити багато часу в очікуванні одного диска, оскільки пропускна спроможність диска обмежена Для полегшення цієї ситуації ядру необхідна багатопотокова зворотний запис У такому випадку жодна чергу запитів не може стати вузьким місцем

У ядрах серії 26 ця проблема вирішується шляхом введення декількох потоків pdflush Кожен потік самостійно виконує зворотну запис сторінок памяті на диск, що дозволяє різним потокам pdflus h працювати з різними чергами запитів пристроїв

Кількість потоків змінюється в процесі роботи системи відповідно до простим алгоритмом Якщо всі існуючі потоки pdflus h виявляються зайнятими протягом однієї секунди, то створюється новий потік pdflush Загальна кількість потоків не може перевищувати значення константи MAX_PDFLUSH_THREADS, яка за замовчуванням дорівнює 8 І навпаки, якщо потік pdflus h перебував у стані очікування більше однієї секунди, то він знищується Мінімальна кількість потоків одно, принаймні, значенням константи MIN_PDFLUSH_THREADS, що за замовчуванням відповідає 2 Таким чином, кількість потоків pdflus h змінюється динамічно в залежності від кількості сторінок, для яких необхідна зворотний запис, і завантаженості цих потоків Якщо всі потоки pdflus h зайняті зворотним записом, то створюється новий потік Це гарантує, що жодна з черг запитів пристроїв не буде перевантажена, в той час як інші черги пристроїв не так завантажені і в них теж можна виконувати зворотну запис Якщо перевантаження запобігається, то кількість потоків pdflus h зменшується, щоб звільнити память

Вce це добре, але що якщо всі потоки pdflus h зависнуть в очікуванні записи в одну і ту ж перевантажену чергу У цьому випадку продуктивність декількох потоків pdflus h не буде вищою продуктивності одного потоку, а кількість використаної памяті стане значно більшим Щоб зменшити такий ефект, для потоків pdflus h реалізований алгоритм запобігання зависання (congestion avoidance) Потоки активно починають зворотну запис сторінок для тих черг, що не перевантажені У результаті потоки pdflus h розподіляють свою роботу з різних черг і утримуються від запису в перевантажену чергу Коли всі потоки pdflus h зайняті роботою і запускається новий потік, то це означає, що вони дійсно зайняті

У звязку з удосконаленням алгоритмів зворотного запису сторінок, включаючи введення демона bdflush, ядро ​​серії 26 дозволяє підтримувати в завантаженому стані значно більшу кількість дисків, ніж у більш старих версіях ядер При активній роботі потоки pdflus h можуть забезпечити більшу пропускну здатність відразу для великої кількості дискових пристроїв

Коротко про головне

У цій главі було розглянуто сторінковий кеш і зворотний запис сторінок Було показано, як ядро ​​виконує всі операції сторінкового введення-виведення, як операції запису відкладаються за допомогою дискового кеша і як дані записуються на диск за допомогою групи потоків простору ядра pdf lush

На підставі матеріалу останніх декількох глав ви отримали стійке уявлення про те, як виконується управління памяттю і файловими системами Тепер давайте перейдемо до теми модулів і подивимося, ядро Linux забезпечує модульну і динамічну інфраструктуру для завантаження коду ядра під час роботи системи

Модулі

езважаючи на те що ядро ​​є монолітним, в тому сенсі що все ядро ​​виконується в загальному захищеному адресному домені, ядро ​​Linux також є модульним, що дозволяє виконувати динамічну вставку і видалення коду ядра в процесі роботи системи Відповідні підпрограми, дані, а також точки входу і виходу групуються в загальний бінарний образ, що завантажується обєкт ядра, який називаєтьсямодулемПідтримка модулів дозволяє системам мати мінімальне базове ядр про з опциональнимі можливостями і драйверів, які е компілюються в якості модулів Модулі також дозволяють просто видаляти і перевантажувати код ядра, що допомагає при налагодженні, а також дає можливість завантажувати драйвери по необхідності у відповідь на появу нових пристроїв з функціями го-

рячего підключення

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

Джерело: Лав, Роберт Розробка ядра Linux, 2-е видання : Пер з англ – М: ТОВ «ІД Вільямс »2006 – 448 с : Ил – Парал тит англ

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*