Чи слід монтувати дані = записування та бар'єр = 0 на ext3?


13

Ми працювали на сервері VM в хостинговій компанії і щойно підписалися на виділений хост (AMD Opteron 3250, 4 ядра, 8 ГБ оперативної пам’яті, 2 х 1 ТБ в програмному RAID, ext3).

Під час виконання тестів на ефективність роботи ми помітили, що деякі транзакції SQLite (комбінація вставок, видалень та / або оновлень) забирали на 10x15 разів більше, ніж у моєму MacBook Pro 2010 року.

Після безлічі гуглів та читання, ми повинні подивитися на варіанти кріплення, які були:

    data=ordered,barrier=1

Ми провели кілька експериментів і отримали найкращі результати

    data=writeback,barrier=0

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

Запитання

Чи можна описати вищезгаданий конфігурацію для розміщеної послуги?

Якщо у нас був відключення електроенергії або жорсткий збій, то ми можемо втратити дані або пошкодити файли. Якщо ми робимо знімки БД кожні 15 хвилин, це може полегшити ситуацію, але БД може не синхронізуватися під час зйомки. Як нам (можна?) Ми забезпечити цілісність такого знімка?

Чи є інші варіанти, які ми повинні розглянути?

Спасибі


Задіяно багато факторів. Чи очікуєте багато важких аварій? У вас підключений ДБЖ (або щось еквівалентне) до розміщеної машини? Ви робили тестування з іншими файловими системами (наприклад, ext4, XFS тощо)? Чи можете ви керувати ((де) активувати) кеш-пам'ять жорсткого диска? Як ви налаштували програмне забезпечення RAID? Чи правильно вирівнюєте жорсткий диск (якщо у вас 4K блоки)?
Гюйгенс

Ми не очікуємо багато важких аварій. У нас немає ДБЖ. Специфікація машини була стандартною «з полиці» від компанії, що займає хостинг, тому: ми не орієнтувались на інші фс, ext3 - це те, що ми отримали. Не знаєте про кеш жорсткого диска, буде розглянуто це, і аналогічно для вирівнювання RAID та HDD. Спасибі.
NeilB

Ще одне запитання, яке я забув, - скільки історії варто собі дозволити втратити? Або ви не можете дозволити собі втрачене? Примітка. SQLite підтримує знімок або іншими словами резервне копіювання запущеної бази даних. sqlite.org/backup.html
Huygens

Яка версія вашого ядра? Бар'єри виконуються md з 2.6.33, не в попередньому випуску ядра.
Гюйгенс

unme -r повідомляє "2.6.32-220.2.1.el6.x86_64". Що таке "md"? Якщо бар'єри не виконуються в цій версії ядра, чому я побачив покращення продуктивності при відключенні бар'єрів?
NeilB

Відповіді:


15

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

Видалення бар'єрів запису
Якщо ви видалите бар'єр запису, то у випадку збою або втрати живлення, файловій системі потрібно буде виконати fsck для відновлення структури диска (зауважте, що навіть при включеному бар'єрі, більшість файлових систем журналу все-таки робитиме fsck навіть хоча перевидання журналу повинно було бути достатнім). Видаляючи бар'єр запису, бажано, якщо можливо, видалити кешування диска (на апаратному забезпеченні), це допоможе мінімізувати ризик. Однак вам слід порівняти вплив такої зміни. Ви можете спробувати цю команду (якщо ваше обладнання підтримує її) hdparm -W0 /dev/<your HDD>.
Зауважте, що ext3 використовує 2 бар'єри для зміни метаданих, тоді як ext4 використовує лише один при використанні параметра монтажу journal_async_commit.

Хоча Тед Т'со пояснив, чому в перші дні ext3 трапилося декілька пошкоджень даних (бар'єри були вимкненими за замовчуванням до ядра 3.1 ), журнал розміщується таким чином, що, якщо не відбудеться обгортання журналу журналу (журнал є циклічним журналом) дані записуються на диск у безпечному порядку - по-перше, журнал, другий - навіть із жорстким диском, що підтримує впорядкування записів.
В основному, було б невдало, що під час загортання журналу журналу журналу журналу відбувається збій системи або втрата електроенергії. Однак потрібно триматись data=ordered. Спробуйте порівняти data=ordered,barrier=0додатково.

Якщо ви можете дозволити собі втратити кілька секунд даних, ви можете активувати обидва варіанти, data=writeback,barrier=0але потім спробувати експериментувати і з цим commit=<nrsec>параметром. Ознайомтеся з посібником для цього параметра тут . В основному ви даєте кілька секунд, що є періодом, коли файлова система ext3 буде синхронізувати свої дані та метадані.
Ви також можете спробувати познайомитись із еталонними ядрами щодо брудних сторінок (тих, які потребують запису на диск), і тут є хороша стаття, яка пояснює все про ці налаштування та про те, як грати з ними.

Підсумок щодо бар'єрів
Ви повинні орієнтувати ще кілька комбінацій змін:

  1. Використовувати data=writeback,barrier=0спільно зhdparm -W0 /dev/<your HDD>
  2. Використовуйте data=ordered,barrier=0
  3. Використовуйте data=writeback,barrier=0разом з іншим варіантом кріплення commit=<nrsec>та спробуйте різні значення для nrsec
  4. Використовуйте варіант 3. і спробуйте додатково відрегулювати на рівні ядра щодо брудних сторінок.
  5. Скористайтеся безпечним data=ordered,barrier=1, але спробуйте інші перенаправлені елементи: особливо елеватор файлової системи (CFQ, Deadline або Noop) та їх відповідні налаштування.

Розгляд питання про перехід до ext4 та його порівняльний аналіз
Як було сказано, ext4 для запису вимагає менше бар'єру, ніж ext3. Крім того, ext4 підтримує розширення, які для великих файлів можуть принести кращу продуктивність. Тож це рішення, яке варто вивчити, тим більше, що легко перейти з ext3 на ext4 без перевстановлення: офіційна документація ; Я робив це в одній системі, але використовуючи цей посібник Debian . Ext4 справді стабільний з ядра 2.6.32, тому його безпечно використовувати у виробництві.

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


Спасибі - багато корисних речей там. Я вже читав ext3 doc на kernel.org і намагався змінити команду, але не мав сенсу для того, що було великим значенням. Встановлено 15, а не 5 секунд, я не бачив змін. Я зроблю ще кілька бенчмаркінгу, щоб висвітлити запропоновані вами перестановки. Знову дякую.
NeilB

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

@NeilB просто натрапляю на ці статті: 1. sqlite.org/draft/lockingv3.html шукайте ext3в ньому. Це дає, можливо, простіше зрозуміти (або спростило) пояснення того, що я намагався вирішити у своїй відповіді. 2. sqlite.1065341.n5.nabble.com/… ви можете спробувати зберегти безпечні параметри ext3 (впорядкований + бар'єр), але видаліть синхронізацію в SQLite. Незабаром я оновлю свою відповідь щодо цього другого аспекту.
Гюйгенс

Дякую за це. Я збираюся опрацювати всі перестановки та запустити з ними по черзі тести на ефективність. На початку я спробував синхронізувати роботу в SQLite і отримав хороші показники продуктивності. Мені потрібно написати якийсь код, щоб спочатку зібрати спектр даних для різних комбінацій операцій запису. Я опублікую резюме тут, але якщо ви хочете отримати більше деталей, я ніл на bowers dot com.
NeilB

10

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

Існує ряд шарів, де можна потурбуватися про продуктивність запису SQLite:

різні рівні для роздумів про продуктивність

Ми дивилися на виділені жирним шрифтом. Конкретні параметри були

  • Кеш запису диска. Сучасні диски мають кеш оперативної пам’яті, який використовується для оптимізації запису диска відносно спінінг-диска. Якщо це ввімкнено, дані можна записувати в блоки, що не впорядковуються, тому, якщо трапиться збій, ви можете отримати частково записаний файл. Перевірте налаштування за допомогою hdparm -W / dev / ... та встановіть його з hdparm -W1 / dev / ... (щоб увімкнути його та -W0 - вимкнути).
  • бар’єр = (0 | 1). Багато коментарів в Інтернеті: "якщо ви працюєте з barrier = 0, не вмикайте кешування запису на диск". Ви можете знайти обговорення бар'єрів на веб-сайті http://lwn.net/Articles/283161/
  • data = (журнал | впорядковано | записування). Подивіться на http://www.linuxtopia.org/HowToGuides/ext3JournalingFilesystem.html для опису цих параметрів.
  • вчинити = N. Повідомляє ext3 для синхронізації всіх даних і метаданих кожні N секунд (за замовчуванням 5).
  • SQLite прагма синхронна = ON | ВИКЛ. Якщо ввімкнено, SQLite гарантує, що транзакція буде "записана на диск" перед продовженням. По суті, вимкнення цього параметра робить інші параметри в значній мірі неактуальними.
  • SQLite прагма cache_size. Контролює, скільки пам'яті використовує SQLite для кешу в пам'яті. Я спробував два розміри: один, де весь БД помістився б у кеш, і той, де кеш був половиною максимального розміру БД.

Детальніше про параметри ext3 читайте в документації на ext3 .

Я проводив тести на ефективність за низкою комбінацій цих параметрів. Ідентифікатор - це номер сценарію, про який йдеться нижче.

Я спробував сценарії

Я почав із запуску з конфігурацією за замовчуванням на моїй машині як сценарій 1. Сценарій 2 - це те, що я вважаю "найбезпечнішим", а потім спробував різні комбінації, де це доречно / запропоновано. Це, мабуть, найлегше зрозуміти з картою, яку я закінчив, використовуючи:

карта, що стосується сценаріїв до параметрів

Я написав тестовий скрипт, в якому було здійснено багато транзакцій, із вставками, оновленнями та видаленнями, і все це на таблицях із лише INTEGER, лише TEXT (із стовпцем id) або змішаним. Я кілька разів запускав це по кожній з конфігурацій, наведених вище:

сюжет із відображенням часу для сценаріїв

Найнижчі два сценарії - №6 та №17, які мають "прагму синхронний = вимкнено", настільки не дивно, що вони були найшвидшими. Наступні групи з трьох - це №7, №11 та №19. Ці три кольори виділені синім кольором на "карті конфігурації" вище. В основному конфігурація - це кеш запису на диск, barrier = 0, а дані встановлені на щось інше, ніж на 'journal'. Зміна фіксування між 5 секундами (# 7) та 60 секундами (# 11), здається, мало має значення. У цих тестах, здається, не так вже й багато, якщо якась різниця між даними = впорядковано та даними = записом, що мене здивувало.

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

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

змішані типи та вставити / оновити / видалити

Тут ви бачите, що конфігурація зворотного запису (№19) трохи повільніше, ніж впорядковані (№7 та №11). Я очікував, що скорочення буде трохи швидшим, але, можливо, це залежить від ваших моделей запису, а може, я просто ще не прочитав достатньо на ext3 :-)

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

Висновок

  • Параметр фіксації, здавалося, мало змінився, тому ми залишаємо це в 5s.
  • У нас йде кеш запису диска, barrier = 0 , а дані = впорядковані . Я читав деякі речі в Інтернеті, які вважають, що це погана установка, а інші, які, здається, вважають, що це має бути типовим у багатьох ситуаціях. Я думаю, що найважливіше - ви приймаєте усвідомлене рішення, знаючи, які компроміси ви робите.
  • Ми не збираємось використовувати синхронну прагму в SQLite.
  • Встановлення прагми cache_size SQLite таким чином, щоб БД помістився в пам’яті для покращення продуктивності деяких операцій, як ми очікували.
  • Наведена вище конфігурація означає, що ми ризикуємо трохи більше. Ми будемо використовувати API резервного копіювання SQLite, щоб мінімізувати небезпеку виходу з ладу диска при частковому записі: робити знімок кожні N хвилин і тримати останній M навколо. Я тестував цей API під час запуску тестів на ефективність, і це дало нам впевненість піти цим шляхом.
  • Якщо ми все-таки хотіли більшого, ми могли б розглянути можливість спілкування з ядром, але ми вдосконалили речі, не ходивши туди.

Завдяки @Huygens за різні поради та вказівки.

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