вести с грабельных полей,
Aug. 22nd, 2012 11:31 amПериод смешных ошибок с неожиданными последствиями.
Не моя: в pidfile пишется просто число - PID, ничем не терминируется, файл предварительно (или после) не зачищается. Работало под pid=12347, запущен новый с pid=3642, в pidfile оказалось 36427.
Моя: в кластере живут данные, реплицирующиеся между нодами, но функция вычистки устаревших данных не доработана. Запускается узел, пытается одновременно добавить новую запись истории о своём запуске и синхронизироваться с остальными, умирает под тяжестью данных и приложений (не хватает виртуальной памяти), но остальные, кто ещё жив, запомнили этот запуск. Запускается заново, ещё добавляет, снова умирает... Когда нашли и идентифицировали проблему, уже вычитка базы с другого узла оказывалась слишком тяжёлой и рвала синхронизацию в кластере. Пришлось полностью погасить сервис динамических данных, чтобы остановить размножение мусора.
Пока не знаю, какие выводы тут делать.
Не моя: в pidfile пишется просто число - PID, ничем не терминируется, файл предварительно (или после) не зачищается. Работало под pid=12347, запущен новый с pid=3642, в pidfile оказалось 36427.
Моя: в кластере живут данные, реплицирующиеся между нодами, но функция вычистки устаревших данных не доработана. Запускается узел, пытается одновременно добавить новую запись истории о своём запуске и синхронизироваться с остальными, умирает под тяжестью данных и приложений (не хватает виртуальной памяти), но остальные, кто ещё жив, запомнили этот запуск. Запускается заново, ещё добавляет, снова умирает... Когда нашли и идентифицировали проблему, уже вычитка базы с другого узла оказывалась слишком тяжёлой и рвала синхронизацию в кластере. Пришлось полностью погасить сервис динамических данных, чтобы остановить размножение мусора.
Пока не знаю, какие выводы тут делать.
no subject
Date: 2012-08-22 09:39 am (UTC)По проблеме умирания по исчерпанию виртуальной памяти вспомнить метод, использовавшийся ещё в TurboVision под DOS, когда во время старта резервируется неиспользуемый буфер памяти небольшого размера и при исчерпании памяти буфер этот используется как свободная динамическая память для завершающих действий.
no subject
Date: 2012-08-22 12:12 pm (UTC)Осталось ядро Linux научить этому. А то сейчас "не кран надо менять, а всю систему"
no subject
Date: 2012-08-22 12:14 pm (UTC)не сойдет за "обучить"?
no subject
Date: 2012-08-22 03:11 pm (UTC)http://groups.google.com/group/fido7.ru.unix.prog/browse_thread/thread/551b8b584a43ea6c/d2032971ec69a1e8
всё давно обсуждено, вспоминай.
no subject
Date: 2012-08-22 12:24 pm (UTC)no subject
Date: 2012-08-22 02:53 pm (UTC)no subject
Date: 2012-08-22 02:56 pm (UTC)no subject
Date: 2012-08-23 04:38 am (UTC)http://groups.google.com/group/fido7.ru.unix.prog/browse_thread/thread/551b8b584a43ea6c/d2032971ec69a1e8
Проблема в том, что "сделать себе лимит памяти" требует специального ядерного механизма, которого не дают.
no subject
Date: 2012-08-23 04:56 am (UTC)На фре есть RLIMIT_VMEM (vmemoryuse): /* virtual process size (inclusive of mmap) */, оно же RLIMIT_AS (это же имя упоминалось в контексте линукса в обсуждении в ru.unix.prog).
no subject
Date: 2012-08-29 08:24 am (UTC)Видимо, плохо прочитал. Потому что суть как раз проигнорировал.
> Если в OS не даёт методов (например, лимиты в Linux не работают?)
При чём тут вообще лимиты в нынешнем виде? Они срабатывают только при их переполнении, и уже в том месте, где попросили ресурс. А если этот запрос неявный (например, copy-on-write страницы), то и сообщить о проблеме невозможно. Надо делать так, чтобы она опознавалась заранее. А теперь покажи, как мне подсчитать лёгким образом (без залазания в /proc/$pid/), какой текущий объём VM процесса и сколько осталось до исчерпания лимита?
> Если даёт методы, надо ими активно пользоваться.
Если бы она давала методы - всё было бы хорошо. Но она ни хрена не даёт.
> На фре есть RLIMIT_VMEM
Ровно настолько же бесполезная хня.
no subject
Date: 2012-08-29 11:19 am (UTC)> как мне подсчитать лёгким образом (без залазания в /proc/$pid/), какой текущий объём VM процесса и сколько осталось до исчерпания лимита
Не знаю, но это не критично - когда лимит исчерпается, тебе система об этом скажет и ты просто откатишь транзакцию, используя резервную память.
no subject
Date: 2012-08-30 06:20 am (UTC)Это лимиты 1 (прописью: одного) процесса. Уже лимиты группы процессов, а тем более фактический лимит всей системы, не может заранее ограничить расширение по copy-on-write.
> Не знаю, но это не критично - когда лимит исчерпается, тебе система об этом скажет и ты просто откатишь транзакцию, используя резервную память.
Отлично! Покажи мне, где этот механизм работает уже сейчас.
no subject
Date: 2012-08-30 06:41 am (UTC)Зачем?
> а тем более фактический лимит всей системы, не может заранее ограничить расширение по copy-on-write.
Зачем системе иметь какой-то лимит? Своп же можно наращивать динамически, а в перспективе и RAM.
no subject
Date: 2012-08-30 06:42 am (UTC)> Отлично! Покажи мне, где этот механизм работает уже сейчас.
Все методы выделения (виртуальной) памяти предусматривают отказ и возврат ошибки, я не понимаю проблемы.
no subject
Date: 2012-08-23 04:42 am (UTC)То, о чём я рассказывал, было о другом - о подсистеме, которая замусоривает себя сама и не может без посторонней помощи (причём с большим количеством ручных действий) выйти из этого состояния.
no subject
Date: 2012-08-23 04:59 am (UTC)no subject
Date: 2012-08-29 08:27 am (UTC)Представь себе, там нет кодов ошибок в этом месте! Им неоткуда взяться.
> Можно ещё архитектору намекнуть, что архитектура созданной подсистемы неадекватна, мягко выражаясь.
1. Тут вопрос не архитектуры, как ни странно.
2. Неадекватность мы уже опознали по факту. Но непонятно, как с ней бороться, сохранив общую цель работы.
no subject
Date: 2012-08-29 11:20 am (UTC)no subject
Date: 2012-08-30 06:22 am (UTC)Их нет.
Программа запускается, забирает у соседа данные (на это памяти ещё хватает), парсит и складывает в постоянную копию (а вот на то чтобы держать и полученное, и сохранённое - уже нет). Никаких кодов. Просто переполнение.
> Если программа не умещается в лимит, она просто не стартует.
Я не знаю, о какой программе ты говоришь, но это точно не у меня.
no subject
Date: 2012-08-30 06:45 am (UTC)Если мы говорим о прикладных программах, они работают с виртуальной памятью. Чтобы начать работать с такой памятью, надо сначала получить её от операционой системы. Если памяти не хватает, она вернет ошибку вместо памяти (NULL/MAP_FAILED/что там ещё). Вот тебе код.
no subject
Date: 2012-08-30 06:46 am (UTC)>Я не знаю, о какой программе ты говоришь, но это точно не у меня.
Это про limit datasize.
no subject
Date: 2012-08-23 05:09 am (UTC)no subject
Date: 2012-08-23 05:12 am (UTC)no subject
Date: 2012-08-23 10:36 am (UTC)no subject
Date: 2012-08-30 06:19 am (UTC)no subject
Date: 2012-08-29 09:57 am (UTC)Создание аварийного выхода в случае недостатка памяти, конечно, метод полезный, но в данном случае ещё и непонятно, как его вообще тут применять.