LINUX.ORG.RU

утечки памяти в Twisted — это возможно или фантастика?

 , ,


0

2

день добрый!

может ли быть такое что в Twisted (в частности с twisted.web.client.Agent и обвязка вокруг) — утечки памяти...???

...при этом, говоря про утечки — я имею ввиду НЕ зациклинные ссылки [удаляемые прекрасно через gc.collect()], а именно настоящие(!) утечки (память освобождается только после закрытия процесса).

например, утечки, проявляющиеся после многих многих многих тысяч и десятитысяч миллионов эксплуатаций twisted.web.client.Agent. гигобайты оперативки через много часов работы.

и вот вопрос..., собственно: ...возможно ли такое? или это научная фантастика?

# p.s.: не, не, .. я прсто спрашиваю.. не берусь утверждать чего-то :)

...возможно ли такое?

Да, конечно. Утечки памяти возможны в любом языке, даже с GC. Например, если забывать удалить данные из каких-то глобальных структур.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

ну дааа.АА.. вот я и пытаюсь тут порассуждать :-)

...может ли быть такое что разработчики Twisted чтото забыли удалить из глобальныз данных(?) %) %) :-) ...

...или же они например очень опытные и ничего не забывают?

user_id_68054 ★★★★★
() автор топика
Ответ на: комментарий от user_id_68054

очень опытные и ничего не забывают?

Так не бывает.

anonymous
()
Ответ на: комментарий от user_id_68054

В любом большом проекте это неизбежно. Не ошибаются только избранные.

Но в конкретно твоем случае виноват ты. Рожей не вышел на других пенять.

anonymous
()
Ответ на: комментарий от tailgunner

а вот скажи друг.

...что если сделать тэстовый (крайне-маленький по количеству строчек) проект, который использует крайне массивно twisted.web.client.Agent...

...и окажется что втечении 24 часов этот тестовый-процесс — начнёт плавно занимать много гигобайт оперативной памяти. [даже например с принудительным вызовом gc.collect()].

то что тогда дальше делать? как поступать в таком случае? как жить дальше? (ну конешно только в случае если это дествительно случится).

user_id_68054 ★★★★★
() автор топика
Ответ на: комментарий от user_id_68054

Багрепорт отправь и приложи к нему свой проект.

как жить дальше?

Никак :/

tailgunner ★★★★★
()
Ответ на: комментарий от anonymous

да ты погоди... этоже ещё не случилось!

мыжу тут гипотетическю ситуацию рассматриваем :)

# p.s.: не надо раньше времени делать мне тут сердечные приступы

user_id_68054 ★★★★★
() автор топика
Ответ на: комментарий от user_id_68054

да ты погоди... этоже ещё не случилось!

Я имел ввиду, отправлять багрепорт, если таки случится.

anonymous
()

блин, а почему никто не напишет что-то вроде что мол:

«„“ нет, Twisted 9000 раз проверен. там такого быть не может! (и темболее там стараются не использовать глобальные переменные в модулях) »«» ??

user_id_68054 ★★★★★
() автор топика
Ответ на: комментарий от user_id_68054

блин, а почему никто не напишет что-то вроде что мол:

Все фанбои твистеда сейчас заняты отладкой своих кривулин, подожди до вечера.

anonymous
()

Слишком много точек.

Нужно больше точек!

Kadi
()
Ответ на: комментарий от user_id_68054

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

trashymichael ★★★
()
Ответ на: комментарий от trashymichael

почему эт решил не обременять??.. решил обременить... но паралельно + ещё и посоветоваться на форуме :)

user_id_68054 ★★★★★
() автор топика

пример массового использования twisted.web.client.Agent — это нечто вроде —

#!/usr/bin/env python
# -*- mode: python; coding: utf-8 -*-

from __future__ import absolute_import

import random, itertools
from twisted.internet import reactor, protocol, defer
from twisted.web import client, http_headers

# ********** BEGIN CONFIGURE CONSTANTS **********

DEBUG__USE_GC_COLLECT = True
DEBUG__GC_COLLECT_PERIOD = 1000

URL_TEMPLATE = 'http://example.org/?random=%s'
THREAD_COUNT = 100
URL_COUNT = 'inf' # integer or 'inf'
REQUEST_TIMEOUT = 120.0

# ********** END CONFIGURE CONSTANTS **********

def new_url():
    rnd = '%s-%s-%s-%s' % (
            random.randrange(1000000),
            random.randrange(1000000),
            random.randrange(1000000),
            random.randrange(1000000),
            )
    
    return URL_TEMPLATE % rnd

def new_url_iter():
    while True:
        yield new_url()

class DeliverCloser(protocol.Protocol, object):
    def __init__(self, deferred):
        self._deferred = deferred
    
    def dataReceived(self, data):
        self.transport.loseConnection()
    
    def connectionLost(self, reason):
        self._deferred.callback(None)

@defer.inlineCallbacks
def request_thread(thread_name, url_iter):
    for url in url_iter:
        print u'<%s> %r: opening...' % (thread_name, url)
        try:
            agent = client.Agent(reactor, connectTimeout=REQUEST_TIMEOUT)
            response = yield agent.request(
                    'GET',
                    url,
                    headers=http_headers.Headers({
                            'User-Agent': ['Twisted Web Client for ExampleOrg'],
                            }),
                    )
            response_deferred = defer.Deferred()
            
            response.deliverBody(DeliverCloser(response_deferred))
            yield response_deferred
            print u'<%s> %r: done! [success; code is %r]' % (thread_name, url, response.code)
        except Exception as e:
            print u'<%s> %r: done! [error; %r]' % (thread_name, url, e)
        
        if DEBUG__USE_GC_COLLECT and not random.randrange(DEBUG__GC_COLLECT_PERIOD):
            from gc import collect as gc_collect
            
            print u'<%s> gc_collect() is %r' % (thread_name, gc_collect())

@defer.inlineCallbacks
def bulk_request(url_iter):
    deferred_list = []
    
    print u'bulk: opening...'
    
    for thread_i in xrange(THREAD_COUNT):
        thread_name = 'thread-%r' % thread_i
        deferred = request_thread(thread_name, url_iter)
        deferred_list.append(deferred)
    
    print u'bulk: all opened. waiting...'
    
    for deferred in deferred_list:
        yield deferred
    
    print u'bulk: done!'

@defer.inlineCallbacks
def main():
    if URL_COUNT is None or URL_COUNT in ('inf', 'infinite'):
        url_iter = new_url_iter()
    else:
        url_iter = itertools.islice(new_url_iter(), URL_COUNT)
    
    yield bulk_request(url_iter)
    
    reactor.stop()

if __name__ == '__main__':
    reactor.callLater(0, main)
    reactor.run()

будет ли утечка или нет — ещё не знаю... надо подождать 24 часа :-)

user_id_68054 ★★★★★
() автор топика
Ответ на: комментарий от trashymichael

в реальном проекте.. который побольше чем представленный микро-пример — да — была утечка.. но когда избавился от twisted.web.client.Agent то она прошла

[[[а вот реально рабираться (где ошибка) было некогда в реальном проекте. надо было исправить всё в течении часа-или-двух и всё :-) ...]]]

разумеется что я думаю что ошибка БЫЛА в моём коде, а не twisted... но навсякий случай решил спросить, мож у кого был негативный опыт про twisted :-)

user_id_68054 ★★★★★
() автор топика
Ответ на: комментарий от stevejobs

так и знал :) ... тоже мне совет :-D :-D

эт я уже делал (набирал в гугле) ... увидил кучу советов о том как найти структуры с циклическими ссылками

но выше я уже писал что циклические структуры не интересуют :)

user_id_68054 ★★★★★
() автор топика

хм

...тэстовый скрипт — за первый полчаса набрал 12 мегобайт (944M=>956M) но больше вродебы роста мегобайт не вижу...

фуууууууууууффф... я очень переживал, но теперь дуамаю беспокоится неочем :)

user_id_68054 ★★★★★
() автор топика
Ответ на: комментарий от user_id_68054

багрепорт же ж - неужели только мне очевиден этот единственный выход?

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от anonymous

куча всяких «ProxyFactory memory leak using cglib», не считается

stevejobs ★★★★☆
()
Ответ на: комментарий от LamerOk

проблем с поиском профайлера у нас не бывает

stevejobs ★★★★☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.