Остановка QUIK или странное поведение

Страницы: 1
RSS
Остановка QUIK или странное поведение, Остановка QUIK или странное поведение без зависания
 
Добрый день!
Хочу разобраться в эксплуатации Квика.
На данный момент нами арендуется Windows Server 2008 через брокера.

Проблема непонятного поведения Квика выглядит примерно так:
1. Теряется соединение.
Сам Квик не хочет повторить соединение.
Завсиания не наблюдается (менюшки работают)
При этом Интернет есть и с другого рабочего места коннект есть и удалённое управление работает.

2. Пробуем перелогиниться.
Соединение происходит и далее дальнейшая работа продолжается.

3. Вчера выдал Квик, что недостаточно ему памяти для выполнения Люа модуля.
Памяти сам Квик занимал вчера 1,6 ГБайт, а сегодня 2,6 ГБайт.
И сегодня ему памяти достаточно.
Но поведение такое же, но Люа модуль работает нормально, но коннект потерялся.

4. Высылаю скриншоты Диспетчера задач.




 
В догонку к пред. посту хочу добавить:

1. В списке инструментов включён только один инструмент (фьючерс Si-12.5)
Это я у тому, что нет трансляции множества торгуемых инструментов, которые могли бы забить память основательно.

2. Перед запуском я почистил временные таблицы Квика (через меню в Квике).
<Связь> - <Очитить всё и начать новый сеанс>
 
Добрый день.

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

Что касается проблем с разрывом соединения - нужно понимать природу ошибки, которая ведёт к его разрыву. Какая именно ошибка появляется? Если сетевая - то нужно смотреть состояние сети на момент разрыва.
 
Добрый вечер!
1. Измерил потребление памяти программой,
оказалось, что это смешные объёмы, примерно 60 МБайт, по сравнению с 2.6 ГБайтами, это совсем немного.
2. Убрал лишние таблицы, которые не использую, например, котировки фьючерса и сам стакан, поскольку есть программная подписка на инструмент.
Но это не помогло.
3. Потом товарищ нашёл программу, которая чистит память - MemReduct.
Пока, помогает, если запускать периодически.
Кстати,  не только у меня такая проблема, в Инете народ тоже пользуется этой прогой.
Возможно, Квик берёт память и не освобождает, плюс ещё и фрагментированность памяти плохо влияет.
 
Забыл добавить:
- Программа MemReduct освобождает примерно 2.3 ГБайта из занятых 2.6 ГБайт.
Далее Квик вновь "копит" память".
 
Нужно смотреть в сторону скрипта. И по возможности оптимизировать его алгоритм. В зависимости от ситуации можно добиться снижения потребления памяти скриптом в разы.
Скрипт работает с таблицей всех сделок?
Надо делать так, как надо. А как не надо - делать не надо.
 
1. Вот, именно, "Таблица всех сделок" и забирает основную память, но никак не 2 ГБайта.
более ничего, кроме таблиц вывода текущей информации.
Причём, Квик сам с "Таблицой всех сделок" разбирается, что касается распределения её в памяти.
В "Таблицу всех сделок" попадает только один фин. инструмент.

2. И ещё мой 1 структурный массив, который в OnInit() инициализируется, но он небольшой 50-100 КБайт.
 
Доброе утро!
Возможно кому-то будет полезен опыт борьбы с перерасходом памяти.
Несколько дней потратил на выяснение и оптимизацию.
Что выяснил:
1. Память тратиться очень серьёзно только лишь на табличное представление (вывод текущей информации)
через функции, находящиеся в quik_table_wrapper.lua
2. В течении работы программы использовалась функция-метод - t:AddLine(),
которая "обеспечивала" основное потребление памяти.
3. Пришлось урезать количество строк оконного вывода текущей инфы.
4. Функция t:Clear() удаляет строки в таблице, но не освобождается память.
5. Остаётся только удалять таблицу и вновь создавать при достижении граничного значения, но я ещё этот способ не тестил.
Массу неудобств создаёт плохое управление памятью в модулях написанных на "Люа" для работы с таблицами.

Очень большая просьба к разработчикам:
- Посмотрите и усильте внутри контроль расхода памяти, что касается вышеизложенного, т.е. табличного вывода.
 
Здравствуйте,
Сообщите пожалуйста версию терминала QUIK на котором воспроизводили проблему.
 
Цитата
Фёдор Сухов пишет:
2. В течении работы программы использовалась функция-метод - t:AddLine(),
которая "обеспечивала" основное потребление памяти.
3. Пришлось урезать количество строк оконного вывода текущей инфы.
Возможно нужно всего лишь правильно переписать скрипт :) и все будет хорошо
 
Цитата
Sergey Gorokhov пишет:
Здравствуйте,
Сообщите пожалуйста версию терминала QUIK на котором воспроизводили проблему.
Версия QUIK 6.17.3.6
 
Цитата
Фёдор Сухов пишет:
Цитата
Sergey Gorokhov пишет:
Здравствуйте,
Сообщите пожалуйста версию терминала QUIK на котором воспроизводили проблему.
Версия QUIK 6.17.3.6
Фёдор, описанная проблема у нас упорно не воспроизводится. Память не накапливается. После Clear память освобождается. Возможно у Вас данные копятся в какой-то переменной? Пришлите для анализа скрипт на котором наблюдается проблема.
 
Цитата
Sergey Gorokhov пишет:
Цитата
Фёдор Сухов пишет:
Цитата
Sergey Gorokhov пишет:
Здравствуйте,
Сообщите пожалуйста версию терминала QUIK на котором воспроизводили проблему.
Версия QUIK 6.17.3.6
Фёдор, описанная проблема у нас упорно не воспроизводится. Память не накапливается. После Clear память освобождается. Возможно у Вас данные копятся в какой-то переменной? Пришлите для анализа скрипт на котором наблюдается проблема.
Добрый день!
Вот толькочто потестил 5 пункт: (5. Остаётся только удалять таблицу и вновь создавать при достижении граничного значения).
Проблема исчезла, то есть при удалении таблицы память освобождается.


А насчёт того где может накапливаться в какой-то из переменных, не очень понимаю, я же использовал и чистил таблицу, используя табличный идентификатор. Посмотрю ещё что там может быть. Выделю часть кода и вышлю.
 
Вот, как и обещал, высылаю вырезку из кода:
Код
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
 
 
Цитата
Фёдор Сухов пишет:
А насчёт того где может накапливаться в какой-то из переменных, не очень понимаю, я же использовал и чистил таблицу, используя табличный идентификатор. Посмотрю ещё что там может быть. Выделю часть кода и вышлю.
речь не про таблицу, а про переменные в коде.
Если какая-то переменная, хранит данные, то они занимают память.
Если в переменной много данных, то занимается много памяти.
То что память освобождается при удалении таблицы может быть не более чем совпадением.
Просьба прислать полную версию скрипта для анализа.
Вы можете не публиковать его на форуме а прислать нам на почту quiksupport@arqatech.com
 
Цитата
Sergey Gorokhov пишет:
Цитата
Фёдор Сухов пишет:
А насчёт того где может накапливаться в какой-то из переменных, не очень понимаю, я же использовал и чистил таблицу, используя табличный идентификатор. Посмотрю ещё что там может быть. Выделю часть кода и вышлю.
речь не про таблицу, а про переменные в коде.
Если какая-то переменная, хранит данные, то они занимают память.
Если в переменной много данных, то занимается много памяти.
То что память освобождается при удалении таблицы может быть не более чем совпадением.
Просьба прислать полную версию скрипта для анализа.
Вы можете не публиковать его на форуме а прислать нам на почту quiksupport@arqatech.com
У меня нет таких переменных, которые много занимают памяти.
Проблема памяти решилась только при удалении таблицы.
Вот уже за сегодня с 10:00 сменилось 10 таблиц и память не расходуется, а держится, примерно, на утреннем уровне - 384500.
Я прекрасно понимаю проблему утечки памяти и всегда контролирую этот процесс, поэтому у меня нет сейчас никаких переменных или больших массивов, да и ни к чему они мне.
 
Немного добавлю:
- Отличие в предыдущей версии было в том, что метод t:AddLine()

вызывался последовательно перед новым заполнением таблицы.

Может из-за этого было фрагментирование памяти и её неосвобождение.
Не хочется экспериментировать на реальном счёте.
Чуть позже на демо попробую вернуть ситуацию и потестить.
 
Цитата
Фёдор Сухов пишет:
Немного добавлю:
- Отличие в предыдущей версии было в том, что метод 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

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

Код
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
 


Так вот, память расходуется достаточно заметно, если смотреть с помощью менеджера задач.
 
Цитата
Фёдор Сухов пишет:
Так вот, память расходуется достаточно заметно, если смотреть с помощью менеджера задач.
Здравствуйте,
Ранее Вы говорили о том что память не освобождается.
Так вот мы запустили присланный код у себя, память прекрасно освобождается.
Возможно не LUA ест память, а в таблица Всех Сделок в которую льются данные?
 
Добрый день!

О том что "Таблица всех сделок" ест память это и так понятно, но она по объёму не превышает 30-60 МБ за торговый день, точно не мерял,
Если я запускаю высланный мой пример, то память расходуется с высокой скоростью и уже к 14:00 потребление может превышать более 1 ГБайта не только на реале, но и на демо(с меньшим расходом).

Поэтому я вставил удаление таблицы и, повторяю, проблема исчезла.

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

Может давайте установим контакт через Teamviewer и вы сами воочию убедитесь что происходит.

Надо же как-то решить этот вопрос.
 
Здравствуйте,
Просьба прислать нам для анализа архив всей папки с терминалом QUIK (без ключей доступа) созданный сразу после возникновения проблемы. Архив следует паковать при закрытом терминале.
А также скриншот диспетчера задач
На ящик quiksupport@arqatech.com
Страницы: 1
Читают тему
Наверх