Остановка QUIK или странное поведение, Остановка QUIK или странное поведение без зависания
Пользователь
Сообщений: Регистрация: 28.07.2015
16.10.2015 17:52:12
Добрый день! Хочу разобраться в эксплуатации Квика. На данный момент нами арендуется Windows Server 2008 через брокера.
Проблема непонятного поведения Квика выглядит примерно так: 1. Теряется соединение. Сам Квик не хочет повторить соединение. Завсиания не наблюдается (менюшки работают) При этом Интернет есть и с другого рабочего места коннект есть и удалённое управление работает.
2. Пробуем перелогиниться. Соединение происходит и далее дальнейшая работа продолжается.
3. Вчера выдал Квик, что недостаточно ему памяти для выполнения Люа модуля. Памяти сам Квик занимал вчера 1,6 ГБайт, а сегодня 2,6 ГБайт. И сегодня ему памяти достаточно. Но поведение такое же, но Люа модуль работает нормально, но коннект потерялся.
4. Высылаю скриншоты Диспетчера задач.
Пользователь
Сообщений: Регистрация: 28.07.2015
16.10.2015 18:05:38
В догонку к пред. посту хочу добавить:
1. В списке инструментов включён только один инструмент (фьючерс Si-12.5) Это я у тому, что нет трансляции множества торгуемых инструментов, которые могли бы забить память основательно.
2. Перед запуском я почистил временные таблицы Квика (через меню в Квике). <Связь> - <Очитить всё и начать новый сеанс>
QUIK clients support
Сообщений: Регистрация: 22.12.2014
20.10.2015 07:42:49
Добрый день.
Мы правильно понимаем, что основная проблема - это большое потребление памяти? Если да - то нужно смотреть скрипт, по возможности оптимизировать его, проверить версию программы на актуальность.
Что касается проблем с разрывом соединения - нужно понимать природу ошибки, которая ведёт к его разрыву. Какая именно ошибка появляется? Если сетевая - то нужно смотреть состояние сети на момент разрыва.
Пользователь
Сообщений: Регистрация: 28.07.2015
20.10.2015 18:17:04
Добрый вечер! 1. Измерил потребление памяти программой, оказалось, что это смешные объёмы, примерно 60 МБайт, по сравнению с 2.6 ГБайтами, это совсем немного. 2. Убрал лишние таблицы, которые не использую, например, котировки фьючерса и сам стакан, поскольку есть программная подписка на инструмент. Но это не помогло. 3. Потом товарищ нашёл программу, которая чистит память - MemReduct. Пока, помогает, если запускать периодически. Кстати, не только у меня такая проблема, в Инете народ тоже пользуется этой прогой. Возможно, Квик берёт память и не освобождает, плюс ещё и фрагментированность памяти плохо влияет.
Пользователь
Сообщений: Регистрация: 28.07.2015
20.10.2015 18:38:11
Забыл добавить: - Программа MemReduct освобождает примерно 2.3 ГБайта из занятых 2.6 ГБайт. Далее Квик вновь "копит" память".
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
20.10.2015 18:57:30
Нужно смотреть в сторону скрипта. И по возможности оптимизировать его алгоритм. В зависимости от ситуации можно добиться снижения потребления памяти скриптом в разы. Скрипт работает с таблицей всех сделок?
Надо делать так, как надо. А как не надо - делать не надо.
Пользователь
Сообщений: Регистрация: 28.07.2015
20.10.2015 19:08:26
1. Вот, именно, "Таблица всех сделок" и забирает основную память, но никак не 2 ГБайта. более ничего, кроме таблиц вывода текущей информации. Причём, Квик сам с "Таблицой всех сделок" разбирается, что касается распределения её в памяти. В "Таблицу всех сделок" попадает только один фин. инструмент.
2. И ещё мой 1 структурный массив, который в OnInit() инициализируется, но он небольшой 50-100 КБайт.
Пользователь
Сообщений: Регистрация: 28.07.2015
23.10.2015 12:07:48
Доброе утро! Возможно кому-то будет полезен опыт борьбы с перерасходом памяти. Несколько дней потратил на выяснение и оптимизацию. Что выяснил: 1. Память тратиться очень серьёзно только лишь на табличное представление (вывод текущей информации) через функции, находящиеся в quik_table_wrapper.lua 2. В течении работы программы использовалась функция-метод - t:AddLine(), которая "обеспечивала" основное потребление памяти. 3. Пришлось урезать количество строк оконного вывода текущей инфы. 4. Функция t:Clear() удаляет строки в таблице, но не освобождается память. 5. Остаётся только удалять таблицу и вновь создавать при достижении граничного значения, но я ещё этот способ не тестил. Массу неудобств создаёт плохое управление памятью в модулях написанных на "Люа" для работы с таблицами.
Очень большая просьба к разработчикам: - Посмотрите и усильте внутри контроль расхода памяти, что касается вышеизложенного, т.е. табличного вывода.
Пользователь
Сообщений: Регистрация: 23.01.2015
23.10.2015 13:14:43
Здравствуйте, Сообщите пожалуйста версию терминала QUIK на котором воспроизводили проблему.
Пользователь
Сообщений: Регистрация: 02.07.2015
23.10.2015 14:35:29
Цитата
Фёдор Сухов пишет: 2. В течении работы программы использовалась функция-метод - t:AddLine(), которая "обеспечивала" основное потребление памяти. 3. Пришлось урезать количество строк оконного вывода текущей инфы.
Возможно нужно всего лишь правильно переписать скрипт :) и все будет хорошо
Пользователь
Сообщений: Регистрация: 28.07.2015
25.10.2015 20:34:06
Цитата
Sergey Gorokhov пишет: Здравствуйте, Сообщите пожалуйста версию терминала QUIK на котором воспроизводили проблему.
Sergey Gorokhov пишет: Здравствуйте, Сообщите пожалуйста версию терминала QUIK на котором воспроизводили проблему.
Версия QUIK 6.17.3.6
Фёдор, описанная проблема у нас упорно не воспроизводится. Память не накапливается. После Clear память освобождается. Возможно у Вас данные копятся в какой-то переменной? Пришлите для анализа скрипт на котором наблюдается проблема.
Sergey Gorokhov пишет: Здравствуйте, Сообщите пожалуйста версию терминала QUIK на котором воспроизводили проблему.
Версия QUIK 6.17.3.6
Фёдор, описанная проблема у нас упорно не воспроизводится. Память не накапливается. После Clear память освобождается. Возможно у Вас данные копятся в какой-то переменной? Пришлите для анализа скрипт на котором наблюдается проблема.
Добрый день! Вот толькочто потестил 5 пункт: (5. Остаётся только удалять таблицу и вновь создавать при достижении граничного значения). Проблема исчезла, то есть при удалении таблицы память освобождается.
А насчёт того где может накапливаться в какой-то из переменных, не очень понимаю, я же использовал и чистил таблицу, используя табличный идентификатор. Посмотрю ещё что там может быть. Выделю часть кода и вышлю.
Пользователь
Сообщений: Регистрация: 28.07.2015
26.10.2015 11:06:26
Вот, как и обещал, высылаю вырезку из кода:
Код
t={}
function OnInit()
local d, mn, y
bar=0
CreateTable()
end
function CreateTable()
t = QTable.new()
if not t then
message("error!", 3)
end
t:AddColumn("Time", QTABLE_CACHED_STRING_TYPE, 20)
t:AddColumn("Deals inf and etc.", QTABLE_CACHED_STRING_TYPE, 120)
t:AddColumn("Ballance", QTABLE_CACHED_STRING_TYPE, 40)
t:SetCaption("Our Deals Table")
t:Show()
for i=1,TotalString do t:AddLine() end
end
function PrintTable(timestring, comment, txt_balance)
local tmp_txt=""
if f==TotalString then
f=0
t:Clear()
t:delete() -- !!! Ранее это строки не было !!!
CreateTable() -- !!! Ранее это строки не было !!!
end
f=f+1
SetCell(t.t_id, f, 1, timestring)
SetCell(t.t_id, f, 2, comment)
SetCell(t.t_id, f, 3, txt_balance)
if txt_balance==nil or txt_balance=="" then
txt_balance=" "
end
tmp_txt=tostring(f)..": "..timestring..": "..comment.." : "..txt_balance.."\n"
file3:write(tmp_txt)
end
Пользователь
Сообщений: Регистрация: 23.01.2015
26.10.2015 13:34:06
Цитата
Фёдор Сухов пишет: А насчёт того где может накапливаться в какой-то из переменных, не очень понимаю, я же использовал и чистил таблицу, используя табличный идентификатор. Посмотрю ещё что там может быть. Выделю часть кода и вышлю.
речь не про таблицу, а про переменные в коде. Если какая-то переменная, хранит данные, то они занимают память. Если в переменной много данных, то занимается много памяти. То что память освобождается при удалении таблицы может быть не более чем совпадением. Просьба прислать полную версию скрипта для анализа. Вы можете не публиковать его на форуме а прислать нам на почту quiksupport@arqatech.com
Фёдор Сухов пишет: А насчёт того где может накапливаться в какой-то из переменных, не очень понимаю, я же использовал и чистил таблицу, используя табличный идентификатор. Посмотрю ещё что там может быть. Выделю часть кода и вышлю.
речь не про таблицу, а про переменные в коде. Если какая-то переменная, хранит данные, то они занимают память. Если в переменной много данных, то занимается много памяти. То что память освобождается при удалении таблицы может быть не более чем совпадением. Просьба прислать полную версию скрипта для анализа. Вы можете не публиковать его на форуме а прислать нам на почту quiksupport@arqatech.com
У меня нет таких переменных, которые много занимают памяти. Проблема памяти решилась только при удалении таблицы. Вот уже за сегодня с 10:00 сменилось 10 таблиц и память не расходуется, а держится, примерно, на утреннем уровне - 384500. Я прекрасно понимаю проблему утечки памяти и всегда контролирую этот процесс, поэтому у меня нет сейчас никаких переменных или больших массивов, да и ни к чему они мне.
Пользователь
Сообщений: Регистрация: 28.07.2015
26.10.2015 16:53:56
Немного добавлю: - Отличие в предыдущей версии было в том, что метод t:AddLine()
вызывался последовательно перед новым заполнением таблицы.
Может из-за этого было фрагментирование памяти и её неосвобождение. Не хочется экспериментировать на реальном счёте. Чуть позже на демо попробую вернуть ситуацию и потестить.
Пользователь
Сообщений: Регистрация: 23.01.2015
27.10.2015 11:30:17
Цитата
Фёдор Сухов пишет: Немного добавлю: - Отличие в предыдущей версии было в том, что метод t:AddLine()
вызывался последовательно перед новым заполнением таблицы.
Может из-за этого было фрагментирование памяти и её неосвобождение. Не хочется экспериментировать на реальном счёте. Чуть позже на демо попробую вернуть ситуацию и потестить.
Повторю, у нас описанная проблема не повторяется. Вот код на котором воспроизводили
Код
function main()
t_id=AllocTable()
AddColumn(t_id,1,"QWERTY",true,QTABLE_INT_TYPE,10) --Y
CreateWindow(t_id)
SetWindowCaption(t_id,"Script message.")
i=1
while true do
for j=i,i+10000 do
tmp=InsertRow(t_id,-1)
SetCell(t_id,tmp,1,tostring(j),j)
end
i=i+10000
sleep(1000)
Clear(t_id)
end
end
Если требуется дальнейшая диагностика, нам нужен исходный код на котором проблема воспроизводится у Вас Вам не надо ничего воспроизводить. Просто пришлите код.
Пользователь
Сообщений: Регистрация: 28.07.2015
28.10.2015 20:51:11
Взял ваш исходник и дописал так как вот у меня было до удаления таблицы.
Код
h=0
m=0
s=0
str="This is test/..This is test/.."
str2="This is test/..This is test/..This is test/..This is test/..This is test/..This is test/..This is test/..This is test/"
function OnAllTrade(alltrade)
h=alltrade.datetime.hour+0
m=alltrade.datetime.min+0
s=alltrade.datetime.sec+0
end
function main()
t_id=AllocTable()
AddColumn(t_id,1,"QWERTY",true, QTABLE_INT_TYPE,10) --Y
AddColumn(t_id,2,"Time",true, QTABLE_CACHED_STRING_TYPE, 20)
AddColumn(t_id,3,"Deals inf and etc.",true, QTABLE_CACHED_STRING_TYPE, 120)
AddColumn(t_id,4,"Ballance",true, QTABLE_CACHED_STRING_TYPE, 40)
CreateWindow(t_id)
SetWindowCaption(t_id,"Script message.")
i=1
while true do
for j=i,i+10000 do
tmp=InsertRow(t_id,-1)
SetCell(t_id,tmp, 1, tostring(j), j)
SetCell(t_id,tmp, 2, tostring(h)..":"..tostring(m)..":"..tostring(s), j)
SetCell(t_id,tmp, 3, str2, j)
SetCell(t_id,tmp, 4, str, j)
end
i=i+10000
sleep(100)
Clear(t_id)
end
end
Так вот, память расходуется достаточно заметно, если смотреть с помощью менеджера задач.
Пользователь
Сообщений: Регистрация: 23.01.2015
29.10.2015 11:16:35
Цитата
Фёдор Сухов пишет: Так вот, память расходуется достаточно заметно, если смотреть с помощью менеджера задач.
Здравствуйте, Ранее Вы говорили о том что память не освобождается. Так вот мы запустили присланный код у себя, память прекрасно освобождается. Возможно не LUA ест память, а в таблица Всех Сделок в которую льются данные?
Пользователь
Сообщений: Регистрация: 28.07.2015
29.10.2015 14:34:05
Добрый день!
О том что "Таблица всех сделок" ест память это и так понятно, но она по объёму не превышает 30-60 МБ за торговый день, точно не мерял, Если я запускаю высланный мой пример, то память расходуется с высокой скоростью и уже к 14:00 потребление может превышать более 1 ГБайта не только на реале, но и на демо(с меньшим расходом).
Поэтому я вставил удаление таблицы и, повторяю, проблема исчезла.
Вот, именно, в таком варианте работает нормально с умеренным потреблением памяти с одним фин. инструментом.
Может давайте установим контакт через Teamviewer и вы сами воочию убедитесь что происходит.
Надо же как-то решить этот вопрос.
Пользователь
Сообщений: Регистрация: 23.01.2015
29.10.2015 16:05:45
Здравствуйте, Просьба прислать нам для анализа архив всей папки с терминалом QUIK (без ключей доступа) созданный сразу после возникновения проблемы. Архив следует паковать при закрытом терминале. А также скриншот диспетчера задач На ящик quiksupport@arqatech.com