bug soft lockup - cpu#0 stuck for 22s

Опублікував Сергій Макаренко 30-01-2018 об 09:00

Раніше я думав, що життя на Linux — то казка, в якій немає місця суму і фрустрації. Але на початку травня 2017 року я зрозумів, що це не так. Одного ранку я прокинувся і знайшов свій HP ProLiant MicroServer G7 намертво завислим. Він не відповідав ні на які зовнішні подразнювачі та всі мої спроби під'єднатися до нього за допомогою ssh закінчувалися невдало з помилкою «connection timeout». У вікні терміналу, за яким я працював у вечері з сервером разом з завислою сесією було видно повідомлення «BUG: soft lockup - CPU#0 stuck for 22s!». Як із цим боротися рецептів не було.

На час виникнення проблеми я користувався Debian GNU/Linux версії 8.7. Гугління не дало якихось однозначних відповідей на те, як лікувати цю проблему. Перелік причин починався з починаючого помирати блока живлення, який не давав достатньої напруги процесору і закінчувався дивними гіпотезами про те, що цю помилку викликають якісь нещодавно внесені зміни у ядрі операційної системи. Продовжуючи свої дослідження, я з'ясував, що проблема проявлялася не часто і була спричинена тим, що один процес займав процесорний час надто довго блокуючи одне, або кілька ядер і не запускався перепланувальник, який би мав виділити процесорний час для іншого процесу.

Оновлення до ядра версії 4.9.0 з бекпортів не вирішило проблеми, зависання повторювалися стабільно і сервер зазвичай зависав через добу роботи. Я навіть відкрив баг #864312 з цього приводу. Проблема почалася після оновлення на ядро версії 3.16.43-2+deb8u2 і стабільно відтворювалося на версіях ядра з бекпортів 4.9.18-1~bpo8+1 та 4.9.25-1~bpo8+1. Єдиним доступним рішенням був відкат на ядро версії 3.16.39-1+deb8u2, яке зараз вже не доступне для встановлення. Оновлення на Debian Stretch теж не дало результатів. Ситуація погіршувалася ще і тим, що Mac Pro з встановленим Debian GNU/Linux версії 9.0 з рідним ядром з репозиторіїв Debian працював як годинник без жодних зависань.

І коли ступінь відчаю сягнув найвищого рівня (бо я реально не розумів, як можна було вирішити цю проблему, а продавати залізяку реально було шкода) вирішення знайшлося досить несподівано. Читаючи інтернети на предмет рецепту, який би мені допоміг виправити цю ситуацію з зависаннями (оскільки мейнтейнери ядра Debian не виявляли взагалі ніякої активності в процесі виправлення знайденого мною бага) я вирішив зібрати останнє стабільне ядро з kernel.org самотужки і перевірити, як буде на ньому працювати мій багатостраждальний MicroServer. Уявіть моє здивування, коли я побачив, що на «ванільному» ядрі мій сервер працював як годинник. Тепер я взяв за звичку збирати ядро для Debian щоразу, як виходить нова версія. Політ стабільний з червня минулого року. Жодного зависання. Робота Debian Stretch протестована на ядрах 4.12, 4.13, 4.14 та 4.15. Мій баг досі не закритий.