Ошибка Mysterious Bus с web.twisted (код работает на одном сервере и не работает на другом)

Я просто пытаюсь показать элементы некоторой базы данных один за другим:

from twisted.web import server, resource
from twisted.internet import reactor
from pymongo import Connection
import time
import pprint


class ZenResource(resource.Resource):
    isLeaf = True

    connection = Connection('...', 27017)
    db = connection.data
    db.authenticate("...","...")
    iter = db.index.find()

    def render_GET(self, request):
        item = self.iter.next()
        # ... simple processing, skipped some simple strings manipulations:
        htmlLines = []
        for textLine in pprint.pformat(item).splitlines():
            htmlLines.append('<br/>%s' % textLine) 
        htmlText = '\n'.join(htmlLines)
        request.setHeader("Content-type", 'text/html; charset=UTF-8')
        return htmlText.encode("utf8")

reactor.listenTCP(48088, server.Site(ZenResource()))
reactor.run()

В одной системе (Linux hh 3.0.0-16-generic-pae #28-Ubuntu SMP Пт, 27 января, 19:24:01 UTC 2012 i686 i686 i386 GNU/Linux) все работает нормально. В другой системе (Linux localhost 2.6.38-8-server #42-Ubuntu SMP Mon 11 Apr 03:49:04 UTC 2011 x86_64 x86_64 x86_64 GNU/Linux)

Я получил следующее:

root@localhost:~# python zen.py  
Bus error

Единственная разница между двумя серверами, о которой я думаю (помимо x32/x64), заключается в том, что на втором сервере есть аналогичный закрученный процесс. Этот процесс делает что-то важное, и я действительно не хочу прерывать или каким-либо другим образом вмешиваться в него, просто чтобы проверить, работает ли мой тестовый код.


person Moonwalker    schedule 16.02.2012    source источник
comment
Если вы не можете остановить сервер на работающей машине, можете ли вы запустить аналогичный сервер на машине, которая не работает? По крайней мере, это даст вам подсказку, если вы ищете в нужном месте. Однако я подозреваю, что вы немного неправильно используете (или есть ошибка) нативную библиотеку, возможно, ваше соединение с базой данных, и эта ошибка проявляется в другой архитектуре.   -  person Malvolio    schedule 17.02.2012
comment
Другие мои машины только x32 и с ними все работает нормально. Проблема в том, что другие мои машины не предназначены для производства, это своего рода тестовые/временные серверы, и мне нужно написать код для запуска на рабочем сервере.   -  person Moonwalker    schedule 17.02.2012
comment
Я не могу себе представить, как это может быть связано с Twisted. Мое предположение: плохая оперативная память.   -  person Glyph    schedule 18.02.2012
comment
@Glyph - это может быть вызвано определенным неисправным оборудованием только в том случае, если ОС каждый раз загружает интерпретатор Python одинаково; маловероятно. ОП: сейчас вам нужно попытаться сузить возможности. Сначала попытайтесь найти где происходит сбой. Это означает много печатных заявлений (да, вы развлекаетесь, как в 1979 году). Вероятно, он будет где-то в run, потому что Бог ненавидит программистов, а это значит, что в установке Python есть изъян; переустановить. Однако, если повезет, он будет в вызове базы данных, и вы сможете продолжить расследование там.   -  person Malvolio    schedule 18.02.2012
comment
Что ж, несколько часов назад проблема решилась сама собой: сервер перестал отвечать внешнему миру, и мне пришлось его перезагрузить. Теперь все работает нормально. На самом деле это новый сервер, купленный несколько дней назад, и может быть реальная проблема с оборудованием.   -  person Moonwalker    schedule 18.02.2012
comment
Хотя не уверен, как это понять.   -  person Moonwalker    schedule 18.02.2012
comment
получить трассировку с помощью обработчика ошибок.   -  person jfs    schedule 18.02.2012


Ответы (2)


Попробуйте такой инструмент, как memtest86+, чтобы определить, повреждена ли системная память на машине. Вполне вероятно, что это так, и что случайные сбои при правильном хранении или извлечении данных приводят к вашей проблеме.

В более общем случае, когда у вас возникает подобная проблема, вы должны получить отладочную сборку программного обеспечения (в данном случае Python) и включить дампы памяти (см. ulimit(1)). Когда вы воспроизводите сбой в этой конфигурации, вы можете использовать gdb для изучения дампа ядра, чтобы узнать, какой код вызывает сбой. В случае неисправных модулей памяти сбой, как правило, происходит в каком-то случайном, бессмысленном месте, где весь код кажется правильным (но в любом случае происходит сбой из-за нарушения основного предположения, что данные, однажды вычисленные и сохраненные в памяти, остаются неизменными до тех пор, пока измененный).

Однако вы можете обнаружить, что сбой всегда происходит в одной и той же части кода, и вы даже сможете обнаружить ошибку. Затем исправьте ошибку и двигайтесь дальше. :)

person Jean-Paul Calderone    schedule 18.02.2012
comment
Запустил memtester и ничего не нашел. После перезагрузки сервера ошибка больше не появлялась, поэтому я думаю, что проблема решена. Спасибо всем за ваши ответы. - person Moonwalker; 19.02.2012

В моем недавнем случае это было связано с включенными (и превышенными) пользовательскими квотами в файловой системе. Я предполагаю, что это также может произойти, когда на разделе не осталось свободного места.

person Dologan    schedule 12.02.2016