Таймер OnTimer() барахлит на VDS

 

Вот простейший код советника на таймере

uint _LastTickCount, _LastTickCountTick;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create timer
   EventSetTimer(1);
   _LastTickCount=0;
   _LastTickCountTick=0;
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy timer
   EventKillTimer();
   
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
   uint TickCount, t;
    TickCount=GetTickCount();
    if(_LastTickCount==0)
      {
      _LastTickCount=TickCount;
      return;
      }
   t=TickCount-_LastTickCount;
   _LastTickCount=TickCount;
   Print("Таймер ",t," ms");
   Comment(t);
  }
//+------------------------------------------------------------------+

На VDS стоит win2008 r2 standart SP1, запускал от 1 до 9 терминалов. Файл отчёта прилагаю.

Начиная с 5 терминалов барахлить. На 9 это вообще не похоже на таймер. В диспетчере задач ресурсов вроде хватает. Скрин при работающих 9 терминалах


Файлы:
testtimer.txt  23 kb
 

Это закономерно.

На слабом и придушенном VPS запуск множества терминалов (как и любых других программ, требующих адекватной реакции) неминуемо приведет к задержкам даже в вызове системного таймера.

Обратите внимание, что такие тормоза (в сотни миллисекунд) и на банальном совершении сделок можно получить, используя такие VPS. Поэтому нужно реально оценивать последствия "экономии" из-за упаковки множества программ на одном VPS.

 

Для информации: в нашем сервисе MetaTrader Hosting Server мы все сделали, чтобы принципиально избежать задержек. Мы не тратим по 80% ресурсов на поддержание виртуализации сотни операционок для обеспечения VPS, у нас нулевой оверхед по затратам ресурсов.

Посмотрите мои объяснения: https://www.mql5.com/ru/forum/37453#comment_1161693

 

Что то именно с OnTimer().

Это VDS, а не VPS. И он вроде не слабый. Судя по диспетчеру задач, свободных ресурсов процессора и памяти достаточно. Тики идут в терминале нормально, даже когда с OnTimer клинит на минуты вместо 1 секунды. Попробовал цикл с Sleep(1000) внутри, стабильно выдаёт примерно 1014 ms, никаких тормозов.

Подскажите какие ресурсы винды использует именно  OnTimer. Может как то можно добавить силов именно этому ресурсу винды?

Или всё же не стоит надеяться на нормальную работу  OnTimer и делать по старинке цикл и  Sleep(1000) внутри?

 

OnTimer работает через обычную Windows очередь и обычный механизм Windows таймера.

Он напрямую зависит от нагрузки на операционку, причем ждать cpu = 100% как показатель загруженности компа нельзя. VDS - это маркетинговая перелицовка VPS, никакой разницы нет.

При работе VPS тормоз можно словить в любом месте и он зачастую (без мониторинга ресурсов) невидим. Например, простейшее чтение/запись десятка байт из-за загруженности хостовой машины тормозит процессы операционки на сотни миллисекунд. Это все обычно видно в мониторе ресурсов, где дисковая задержка не 0-5 мс, а 1500-2000 мс. Чуть меньше шансов, но аналогичное можно словить на сетевой карте. 

Причем в этот же самый момент системного тормоза, отдельно и независимо(никуда на диск или сеть не обращающийся) работающий поток может чувствовать себя нормально и правильно отрабатывать Sleep. До момента, пока не влезет в системный синхронный доступ к тормозящему ресурсу.

Про процессор тоже не забывайте. Обычно его 12-16-24 ядер разделяют сотня копий операционок, а видимые вам 2 ядра абсолютно виртуальные и хорошо придушены соседями.