2015-01-19 2 views
1

У меня есть процесс Ruby, непрерывно работающий на экземпляре m3.medium EC2, отображающий содержимое из очереди в S3. Он иногда умирает (обычно несколько раз в день), без видимых причин и объяснений.Отладка загадочного процесса рубинового процесса

Приложение развернуто с помощью эластичного материала и запускается с помощью сценария ebextensions, который запускает ruby --verbose app.rb и передает ошибки в файлы (изначально без --verbose, но мы добавили это в надежде на более подробную информацию). После выхода в файл ничего нет, указывающее на ошибку. Верхнего уровня приложения выглядит следующим образом:

loop do 
    begin 
    do_processing 
    rescue Exception => e 
    puts "Error! #{e}" 
    end 
end 

так что вряд ли выход сам по себе или с исключениями (я думаю).

Сервер остается работоспособным и не исчерпывает память. Иногда он падает при максимальной нагрузке (до 100% от CPU), но не всегда.

Есть ли инструменты Ruby для получения дополнительной информации о том, почему процесс ушел? Возможно ли, что я удалю некоторые другие ограничения EC2 или Ruby, которые закрывают процесс? Что я могу сделать, чтобы получить дополнительную информацию о том, что здесь произошло?

+1

Это не похоже на проблему с Ruby per-see, если процесс убит извне, а не исключение или segfault, вы не получите никакой соответствующей информации AFAIK. Попробуйте '/ var/log/syslog' и посмотрите, есть ли у него какие-либо подсказки. – Kris

ответ

1

Теперь мы решили: проблема в конце была фактическим переполнением стека, глубоко в нашей кодовой базе. У нас была утечка декоратора, где мы иногда заворачивали наш логгер в другом декораторе оформления журналов, и поэтому регистрация стала медленнее и медленнее, и в итоге она оказалась слишком глубокой и разбила приложение. Фиксирование, что многое фиксировало.

Звучит правдоподобно, что переполнение стека не поддается обычным путям и не может вытолкнуть любой вывод в журнал, потому что нет остатка в стеке, что дало сильную кражу Ruby. Это объясняет это аккуратно и исправление, которое полностью фиксировало это для нас.

Для будущих людей, пытающихся отладить такие вещи, если это не ваш ответ: запустите приложение с отбойкой после вскрытия (http://bashdb.sourceforge.net/ruby-debug.html#Post_002dMortem-Debugging), чтобы он открыл отладчик при сбое и увидел, где он заканчивается. Мы обнаружили, что наше приложение содержит много слоев в процессе регистрации, и проблема быстро стала очевидной.

Смежные вопросы