Вверх ↑
Этот топик читают: Гость
Ответов: 655
Рейтинг: 18
#1: 2014-02-09 04:20:38 ЛС | профиль | цитата
Всем привет!

3й день воюю с связкой TCPServerEX и SQlite.
Делаю приложение web сервер для 7-10 пользователей.
1 пользователь вносит данные в BD, остальные через web интерфейс эти данные получают.
С генерацией web страниц и отдачей контента проблем нет.
В примере TCPServerEX элементы схемы располагаются внутри мультика TCPServerEX, по такому же принципу разместил внутри мультика компоненты для работы с БД sqlite..наткнулся на проблему: при подключении пользователя программа начинает "есть" память..каждое подключение пару сотен КБ оперативы съедает...когда пользователь отключается память не очищается...хотя точка ##count TCPServerEX сообщает что копий массива схем 0 т.е. как я понимаю все пользователи отключились и отработанные экземпляры схем удалены.
В связи с чем вопросы:
1) Можно ли в мультик запихивать компоненты для работы с БД sqlite?
2) Как реализовать правильную связку TCPServerEX + Sqlite чтобы не съедалась память и был "многопользовательский" режим? (при условии что все пользователи просто читают данные, только 1 пользователь вносит данные в БД)

code_33010.txt


карма: 0

0
файлы: 1code_33010.txt [2.4KB] [192]
Ответов: 1343
Рейтинг: 31
#2: 2014-02-09 10:38:48 ЛС | профиль | цитата
могу предположить что можно разорвать эту схему на 2 схемы и путём передачи параметров в приложение сообразить многопользовательский режим да и память там не будет так кушать
карма: 2

0
Гость
Ответов: 17029
Рейтинг: 0
#3: 2014-02-09 15:13:27 правка | ЛС | профиль | цитата


Редактировалось 2 раз(а), последний 2017-06-17 20:31:07
карма: 0

0
Ответов: 1058
Рейтинг: 76
#4: 2014-02-09 16:39:14 ЛС | профиль | цитата
77.106.199.165 писал(а):
Товарищи,выручайте

Как?
Интересный у Вас подход к решению собственной задачи.
Предлагаете додумываться как и что доделать в сервере, потом под него сделать клиент, потом все проверить и подать на блюдечке
Для помощи Вам, от Вас требуется:
минимальная рабочая схема с проявлением описанного эффекта. Чтобы желающие Вам помочь, запустили схему и увидели описанную проблему, а не сушили себе мозги как воссоздать на своем компе Вашу ошибку.
карма: 0

0
Ответов: 655
Рейтинг: 18
#5: 2014-02-09 16:56:52 ЛС | профиль | цитата
Tom-it не ругайся)я в начале топика довольно подробно описал все и там же выложил схему.
Простейщий пример БД: [urlhttp://forum.hiasm.com/forum_serv.php?q=56&id=3692[/url]
Пример схемы: http://forum.hiasm.com/xf/attach/code/code_33010.txt

Что выполняет данная схема: При коннекте пользователя производится обычный select * from table; из полученны данных формируется html страница и выдается пользователю.

После каждого подключения пользователя съедается несколько десятков-сотен КБ оперативы, после отключения пользователя память не очищается, хотя ##count TCPServerEX показывает 0 ..т.е. все экземпляры схем отработали и удалены.

карма: 0

0
Ответов: 1058
Рейтинг: 76
#6: 2014-02-09 19:02:14 ЛС | профиль | цитата
Gunnman писал(а):
не ругайся
Не, я не ругаюсь, я замечание делаю.
Gunnman писал(а):
каждое подключение пару сотен КБ оперативы съедает...когда пользователь отключается память не очищается

В программировании не силен и помочь врядли чем смогу, но некоторые наблюдения опишу.

Для начала - пустая форма жрет память. Попробуйте пустую форму подвигать, поклацать, свернуть, развернуть ... И Вы увидите как память увеличивается на несколько кб.

Второе попробуйте для веса в TCPServerEX вложить 1мбайт далее переключайте клиентов и вы увидите, что память меняется в двух направления.
Тоесть увеличивается и уменьшается.

Наверное проблема не в TCPServerEX
------------ Дoбавленo в 19.02:
Самое главное чтобы память уменьшалась, пусть даже не до исходного состояния.

... в исходном состоянии 1мб, при конекте клиентов 10мб, при отключении клиентов возвращалась к 2мб и держала их, даже спустя год- два беспрерывной работы.
карма: 0

0
Ответов: 655
Рейтинг: 18
#7: 2014-02-09 19:15:04 ЛС | профиль | цитата
Ну собственно вынес SQLite_DB за мультик, память стало жрать меньше, оно и понятно, т.к при создании нового экземпляра схемы в мультике БД заново не открывается.
Результаты такие:
Приложение при 0 коннектов 1900-2000кб.
Приложение при 500 коннектах 40 000 - 47 000кб.
Приложение после разрыва 500 коннектов 2200-2300Кб.
Повтор без перезапуска приложения:
Приложение при 0 коннектов 2300кб.
Приложение при 500 коннектах 40 000 - 47 000кб.
Приложение после разрыва 500 коннектов 2440Кб.

Т.е память всеравно потихоньку жрется...и через какое-то время приложение свалится.

Господа...объясните мне твердолобому в чем проблема?
TCPServerEX сам удаляет экземпляр схемы после ее отработки или нет? ##count показывает что подключений 0
карма: 0

0
Ответов: 1343
Рейтинг: 31
#8: 2014-02-09 20:04:55 ЛС | профиль | цитата
Gunnman писал(а):
Т.е память всеравно потихоньку жрется...и через какое-то время приложение свалится.


так а кто мешает сделать внешнее управление ресурсами?
берёшь и делаешь новую програмку которая будет следить за памятью и за сервером тоесть если память уж прям впритык к примеру атака была совершена то перезапустить сервак если же он сам упал то запустить

такая мелкая програмка не должна упасть ну или можно вообще сделать через CMD там то уж точно ничё не упадёт
карма: 2

0
Ответов: 655
Рейтинг: 18
#9: 2014-02-10 01:21:49 ЛС | профиль | цитата
Такой вариант не подойдет.
------------ Дoбавленo в 01.21:
Вопрос решен!

Проблема была в StrCatDelim...использовал данный компонент для склеивания заголовка HTTP и контента.
Компонент имеет собственный буфер, после того как экземпляр мультика отработал (в котором находится StrCatDelim) буфер данного компонента не очищался..или очищался не полностью (даже после удаления экземпляра схемы!) в результате чего возникал эффект "поедания памяти".
Так же SQlite_DB нужно помещать за мультик дабы при создании нового экземпляра схемы БД еще раз не открывалась.


карма: 0

0
Разработчик
Ответов: 26155
Рейтинг: 2127
#10: 2014-02-10 01:30:59 ЛС | профиль | цитата
Gunnman писал(а):
Компонент имеет собственный буфер

Нет там никакого буфера, кроме строковых переменных.
карма: 22

0
Ответов: 655
Рейтинг: 18
#11: 2014-02-10 01:57:35 ЛС | профиль | цитата
doClear - очищает внутренний буфер результата операций.
Пока не стал использовать данную точку в StrCatDelim - оперативка елась..пусть по 10-20кб но постоянно елась!

------------ Дoбавленo в 01.57:
nesco, попробуй эту схему в мультике в 2х вариантах: 1) после склейки строк выполнять doClear в StrCatDelim, затем удалять экземпляр схемы. 2) не использовать doClear и сразу удалять экземпляр схемы.

У меня в втором варианте оперативка постоянно съедается...
Add(StreamConvertor,3708782,399,168)
{
Mode=6
link(onResult,4826314:doValue,[])
}
Add(FileStream,9512716,329,168)
{
link(onLoad,3708782:doConvert,[])
}
Add(FormatStr,7803494,434,259)
{
Mask="HTTP/1.1 200 OK
Content-Length: %2
Content-Type: %1
Connection: close"
Point(FString)
link(onFString,10990004:doStrCatDlm,[])
link(Str1,5120249:Result,[(440,247)(377,247)(377,275)(314,275)])
link(Str2,9512716:Size,[(447,229)(342,229)])
}
Add(StrPart,16443322,252,231)
{
Char="."
link(onSplit,5120249:doMultiReplace,[])
}
Add(Hub,3944757,154,154)
{
OutCount=3
link(onEvent1,12341061:doValue,[(192,160)(192,132)])
link(onEvent2,6716984:doSearch,[(214,167)(214,181)])
link(onEvent3,16443322:doSplit,[(217,174)(217,237)])
}
Add(MultiReplace,5120249,308,231)
{
ReplaceList="css=text/css;
jpg=image/jpeg;
js=application/javascript;
gif=image/gif;
ico=image/x-icon;
html=text/html;
png=image/png;"
link(onResult,7803494:doString,[(387,237)(387,265)])
}
Add(FileSearch,6716984,259,175)
{
Dir="C:\test2"
FullOtherName=1
link(onSearch,9512716:doOpen,[(310,181)(310,174)])
link(Ext,12341061:Value,[])
}
Add(Memory,12341061,259,126)
{
}
Add(StrCatDelim,10990004,511,259)
{
Delimiter="

"
Point(doClear)
link(Str1,7803494:FString,[(517,247)(479,247)(479,303)(440,303)])
link(Str2,4826314:Value,[])
}
Add(Memory,4826314,518,168)
{
}
Add(Button,13050984,91,154)
{
Left=80
Top=145
Data=String(term_bg.png)
link(onClick,3944757:doEvent1,[])
}
Add(Button,3872926,98,203)
{
Left=95
Top=200
link(onClick,8481972:doEvent1,[])
}
Add(Hub,8481972,168,203)
{
OutCount=4
link(onEvent1,9512716:doClose,[(256,209)(256,181)])
link(onEvent2,12341061:doClear,[(220,216)(220,139)])
link(onEvent3,10990004:doClear,[(346,223)(346,272)])
link(onEvent4,4826314:doClear,[(350,230)(350,181)])
}
------------ Дoбавленo в 01.57:
Для лучше эффекта используй любой файл весом от 100кб.
карма: 0

0
Разработчик
Ответов: 26155
Рейтинг: 2127
#12: 2014-02-10 02:37:04 ЛС | профиль | цитата
Gunnman писал(а):
попробуй эту схему в мультике в 2х вариантах

Попробовал в обычном мультике -- никуда ничего не съедается, а колеблется вокруг некоторого среднего значения, что естественно.
карма: 22

0
12
Сообщение
...
Прикрепленные файлы
(файлы не залиты)