Разработка агентов, устойчивых для сервера

Тема в разделе "Lotus - Программирование", создана пользователем fedotxxl, 9 июл 2010.

  1. fedotxxl

    fedotxxl Well-Known Member

    Регистрация:
    9 ноя 2005
    Сообщения:
    614
    Симпатии:
    0
    Привет, люди
    Грустно мне...
    Скажите, как разрабатывать нормальные системы с использованием классов так, чтобы не падал е*учий сервер Lotus Notes?
    А то мало того, что платформа и так достала своей кастрированностью, так и нормально работать не работает - при больших нагрузках просто заваливается сервак (это актуально для систем на классах LS)

    Совет чистить память давать не нужно. Может кто подскажет, как ее контролируемо чистить? И сколько объектов в памяти сервер способен держать без падений?... и в памяти-то дело?
    Кто шарит?
     
  2. Akupaka

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    Нет такого сервера.
    Это тесты проводить надо. Я пока подобных работ не встречал.
     
  3. turumbay

    Регистрация:
    13 мар 2009
    Сообщения:
    625
    Симпатии:
    2
    "не хочешь $рать - не мучай #опу" (с) - народная мудрость
    очередная провокация? зайти на форум и опустить платформу, кормящую многих участников - это смело.
    отмонтируйте /dev/hands от /dev/ass и будет вам щастье.
     
  4. fedotxxl

    fedotxxl Well-Known Member

    Регистрация:
    9 ноя 2005
    Сообщения:
    614
    Симпатии:
    0
    Так, давайте успокоимся


    1. Кто писал системны на классах LS?
    2. Кто встречался с достаточно регулярными падениями сервера? Удалось ли до конца победить падения?
    3. Кто принудительно чистил память? Каким образом (интересует не метод delete, а методика)?
     
  5. Akupaka

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    Не сочти за грубость ))) Иди к Тохе! )) Тот тоже подобным вопросом недавно увлекался. Наверное он в отпуске сейчас - давно не видно.
     
  6. turumbay

    Регистрация:
    13 мар 2009
    Сообщения:
    625
    Симпатии:
    2
    я.
    с регулярными падениями не встречался. те, с которыми встречался были вызваны кривизной рук кодеров ( в т.ч. моих )
    чистил. именно при помощи delete.

    классы - они разные бывают: хочите процедурного агента, укладывающего сервер - их есть у меня :)
    так что дело не в классах. точнее не столько в них. вам уже указывали(http://codeby.net/ipb.html?s=&showtopic=31649&view=findpost&p=146364), что нельзя держать много открытых хэндлов документа. т.е. не надо пытаца инкапсулировать коллекцию на 100,000 документов классом, содержащем список этих документов.
    плюс надо помнить, что лотус плохо чистит "isolation islands".
    Вы написали систему. Большую систему. И она хреново работает на платформе, для которой предназначена.
    Теперь вы хотите поиметь средство диагностики проблем, которое расскажет вам где в системе проблема. Вполне законное желание, особенно если переписывать систему уже поздно.
    Если курение nsd не помогает - выход имхо один: пытаца локализовать проблему. Разбивать систему на куски, отключать агентов, запускать последовательно под нагрузкой. короче - искать причину падения. Возможно, что причина будет в сервере, но скорее всего - она будет в коде. Удачи.

    А вообще, с таким настроением, с лотуса надо уходить. Платформа не для слабонервных :)
     
  7. ToxaRat

    ToxaRat Чёрный маг
    Lotus team

    Регистрация:
    6 ноя 2007
    Сообщения:
    3.046
    Симпатии:
    18
    Akupaka
    в командировке, уже вернулся :lovecodeby:

    fedotxxl
    определись кто виноват, сервер, классы, память и т.д. а то как то настораживает что виновато всё а не ты :)
     
  8. Klido

    Klido Гость

    падения всегда побеждаются :lovecodeby: иначе мы бы теряли работу очень часто :)
     
  9. fedotxxl

    fedotxxl Well-Known Member

    Регистрация:
    9 ноя 2005
    Сообщения:
    614
    Симпатии:
    0
    ToxaRat
    Похоже, что память, т.к. добавление чистки памяти позволило значительно увеличить нагрузку без падений

    Ребят,
    я уже давно ищу четкий ответ на вопрос:
    если делать систему на классах, то в каких случаях падает сервер? Кто-нить это разбирал? Например, меня бы устроил ответ "Если кешировать в классе документ, то сервер падает. Во всех остальных случаях все нормально".

    Ты прав =(. Просто грустно, когда падает сервер, документы (некоторые) в кластере не реплицируются и не редактируются (ошибки разработки нет - queryModeChange пустой, формулы репликации нет), а сервер периодически падает. Устал я от этих проблем....

    http://www-...s-best-practice - перечитаю еще разок
     
  10. VladSh

    VladSh начинающий
    Lotus team

    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    Полностью поддерживаю.


    Ключик к успеху в том, чтобы:

    1. Не использовать в агентах на сервере объектов UI-классов.

    2.
    3. Чистить в той же процедуре, что объявил.
     
  11. fedotxxl

    fedotxxl Well-Known Member

    Регистрация:
    9 ноя 2005
    Сообщения:
    614
    Симпатии:
    0
    Этого добиться и больше сервер падать не будет?)

    Это не всегда возможно

    Еще такой вопрос - принудительно удалять нужно только самописные объекты или же еще и LN?
     
  12. turumbay

    Регистрация:
    13 мар 2009
    Сообщения:
    625
    Симпатии:
    2
    это врятли. падает все, иначе зачем существуют бэкапы? :)
    как минимум есть еще системные ресурсы, которые нужно освобождать: файлы, соединения и т.п.
    внешние библиотеки ( dll , so , всякие COM ) - также могут течь/забывать освобождать ресурсы/тупо падать

    Можно также пошарить сайт вендора:
    GetProfileDocument method appears to leak memory: http://www-01.ibm.com/support/docview.wss?...uid=swg21090756
    Memory leak on 0x11b7 when properties of LotusScript NotesRichTextDocLink class are set: http://www-01.ibm.com/support/docview.wss?...uid=swg21278973
    ну и вообще: http://www.google.com/search?q=lotusscript...ak+site:ibm.com
    P.S. delete для лотусовых объектов никогда не применял( кроме случаев, когда нужно переполучить документ, но это из другой оперы )
     
  13. VladSh

    VladSh начинающий
    Lotus team

    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    Это конечно идеальный вариант, для классов, предназначенных для работы какого-то функционала (которые не содержат данные) это реально.
    Более в общем случае объект надо грохать на одном и том же уровне, например на уровне библиотеки или другого класса (что лучше), причём вызов "грохающего" )) метода должен быть обязательным, не зависимо от ошибки или поведения скрипта. Т.е. в идеале у класса / у любого процедурного функционала (библиотеки), инициализирующего объект самописного класса должно быть 2 функции/метода: открывающий процессы (типа Initialize) и закрывающий; элегантнее конечно это делается на классах. А уж сам верхний класс так и получится: инициализировал, поработал и грохнул, типа того:
    Код (Text):
    Саб Иницыэлайз
    Сет МайОбъект как Новый МайКласс
    Если МайОбъект.Оупэн() Тогда
    Вызов МайОбъект.Ран(параметры)
    Вызов МайОбъект.Клоус()
    Всё
    Замочить МайОбъект
    Энд Саб
     
  14. Akupaka

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    В общем, не согласен. Простой пример: объект Б, состояние которого зависит от другого объекта А.
    Программист создает объект А, создает Б, передает Б ссылку на А, поработал с Б, удаляет Б, при этом Б удаляет А. Далее ошибка работы с А.
    Программист, в общем случае, не ожидает, что Б удалит А.
    Частный же случай - объет А является полностью внутренним для Б, не имеет внешних связей, им же и создан - тогда удаление объектом Б объекта А оправданно вполне.
     
  15. ToxaRat

    ToxaRat Чёрный маг
    Lotus team

    Регистрация:
    6 ноя 2007
    Сообщения:
    3.046
    Симпатии:
    18
    VladSh
    где-то кто-то писал
    что самое плохое в домино это самописные классы в которые есть массимы данных или массивы подклассов
    так вот эти массимы нужно самому прибивать
    я еще до этой темы плотно не добрался, так как пытаюсь найти способ узнать "выгрузился ли агент по окончанию полностью"
     
  16. VladSh

    VladSh начинающий
    Lotus team

    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    Это не просто плохой, а очень плохой стиль кодирования... В нашем случае, это и есть источник падений сервера ;)

    Что касается LS и данной темы выделил жирным:
    <!--QuoteBegin-"Бьерн Страуструп+ «Язык программирования С++»"-->
    <span class="vbquote">("Бьерн Страуструп @ «Язык программирования С++»")</span><!--QuoteEBegin-->СВОД ПРАВИЛ

    1. Когда вы пишите программу, то создаете конкретные представления тех понятий, которые использовались в решении поставленной задачи. Структура программы должна отражать эти понятия настолько явно, насколько это возможно.

    a. Если вы считаете "нечто" отдельным понятием, то сделайте его классом.
    b. Если вы считаете "нечто" существующим независимо, то сделайте его объектом некоторого класса.
    c. Если два класса имеют нечто существенное, и оно является для них общим, то выразите эту общность с помощью базового класса.
    d. Если класс является контейнером некоторых объектов, сделайте его шаблонным классом.

    2. Если определяется класс, который не реализует математических объектов вроде матриц или комплексных чисел и не является типом низкого уровня наподобие связанного списка, то:

    а. Не используйте глобальных данных.
    b. Не используйте глобальных функций (не членов).
    c. Не используйте общих данных-членов.

    d. Не используйте функции friend (но только для того, чтобы
    избежать а, b или c).
    e. Не обращайтесь к данным-членам другого объекта непосредственно.
    f. Не заводите в классе "поле типа"; используйте виртуальные функции.
    g. Используйте функции-подстановки только как средство значительной оптимизации.[/quote]Единственное, без чего трудно обойтись - это 2-b, но если в них не используются объявленные не в самой функции самописные классы (а этого не должно быть!), это никак не влияет на падения сервера.

    Частный и единственно правильный случай.

    Добавлено:
    Не знаю, кто писал, но я к этому сам пришёл и всегда чищу. Также чищу нотесовские объекты, содержащие другие объекты, например NotesDocumentCollection и т.п.

    Это вряд ли получится, разве только не написать специальную задачу нас сервере :)
     
  17. ToxaRat

    ToxaRat Чёрный маг
    Lotus team

    Регистрация:
    6 ноя 2007
    Сообщения:
    3.046
    Симпатии:
    18
    VladSh
    этоя специальной задачей может быть любой агент запускающийся на сервере
    я сейчас пытаюсь понять в каком порядке происходит Initialize/Terminate у агента..... как-то даже не смешно....
     
  18. Akupaka

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    Да ну? Это не стиль, а способ реализации требуемой задачи. Ничего плохого в этом нет.
    А убивать объекты не удостоверившись, что они не используются - это значит хороший стиль? )))

    Как ты привязал это к моему примеру? Тут вовсе другой замысел описан.

    Ты носки по какой-то конкретной системе одеваешь или как вздумается каждый отдельный раз? :)

    И как ты это понимаешь? Если выделил.
    Я понимаю как "обращение к данным объекта необходимо производить через методы доступа". Это ограничивает сказанное мною? О.о

    Тоха, обратись к хелпу, в нем сила ))
     
  19. VladSh

    VladSh начинающий
    Lotus team

    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    Ну тогда так: плохой стиль использовать такие способы )))
    Перепроектирую свою систему.. раньше там было такого навалом, но сейчас я вижу, что можно прекрасно обойтись и без этого.

    Частный случай ухода как раз от такого способа.

    Там ключевое слово "другого".
    Хотя да, - понять можно по разному.
    Общая идея всех трёх пунктов (а их я воспринимаю именно вместе) - не использовать что-то внешнее, тем более, если оно может менять одни и те же данные.
    Согласен, более корректно было бы добавить " и пользоваться объектами, если они составная часть класса, только в этом классе; в исключительных случаях передавать параметром для произведения простейших действий".

    Какой из этого может быть вывод? Только что хреновый программист, раз он этого не ожидает при таких условиях! )))

    Альтернативы?
    Либо писать "абы сейчас было быстро и удобно" и потом *цензура*ься с выпадениями сервера, либо объединить п.1-c Страуструпа (+ учитывать остальные пункты) и это, и писать нормальный код.
     
  20. Akupaka

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    Не в тему. Либо ты плохо объяснил, а я плохо понял. А может проблема в ниже описанном )))
    Ну с таким уклоном надо все описывать в одном объекте! :)
    Ну хорошо, я хреновый программист. Если ты удаляешь объект NotesSession ты ожидаешь, что все полученные с его помощью объекты БД пропадут?
    Если ты уничтожаешь объект NDocCol, ты ожидаешь, что пропадут все объекты NDoc?
    Я хреновый программист.
    Страуструп больше философ, не факт, что его мысли - лучшее решение для любого случая.
     
Загрузка...

Поделиться этой страницей