Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: System грузит ЦП при активной работе с сокетами Добавлено: 06.07.12 18:14  

Автор вопроса:  Programmer
Добрый день!

Запускаю сервер и клиент (самописные), они создают 2000-3000 локальных TCP соединений и передают 4 мбайт/с на все соединения в сумме.

Сервер грузит 25-30%, клиент тоже. При этом System начинает активно использовать ЦП - 30%. На Windows 7 общая нагрузка 100%, на XP ситуация гораздо лучше, но проблема тоже есть.

На одном форуме советовали отключить управление электропитанием для сетевой карты в диспетчере устройств. На ХР вроде помогло (System грузит ЦП, но меньше), на Windows 7 все осталось как было.

XP и Win 7 на разных компах. Там, где сейчас Win 7 раньше работала XP - ситуация была аналогичная с компом, на котором сейчас XP. Т.е. дело не в железе.

Еще кое что: когда я попробовал создать на Win 7 больше соединений, сначала погас экран, потом вылетел BSOD "BAD_POOL_CALLER". На Win XP все нормально.

С сокетами работаю асинхронно. В отдельном потоке периодически обхожу все соединения и вызываю BeginReceive (только там, где предыдущие данные приняты). Данные храню в буфере и отправляю синхронным Send-ом из того же потока.

В чем может быть проблема?

Заранее спасибо за помощь!

Ответить

  Ответы Всего ответов: 9  

Номер ответа: 1
Автор ответа:
 Programmer



Вопросов: 71
Ответов: 246
 Профиль | | #1 Добавлено: 06.07.12 18:26
P.S. В соседней теме скрины на ХР не просто так :)

Ответить

Номер ответа: 2
Автор ответа:
 AgentFire



ICQ: 192496851 

Вопросов: 75
Ответов: 3178
 Профиль | | #2 Добавлено: 06.07.12 19:21
сырцы бы

Ответить

Номер ответа: 3
Автор ответа:
 Programmer



Вопросов: 71
Ответов: 246
 Профиль | | #3 Добавлено: 06.07.12 21:32
У тебя есть скайп? Сырцы кину, только не в паблик.

Ответить

Номер ответа: 4
Автор ответа:
 Programmer



Вопросов: 71
Ответов: 246
 Профиль | | #4 Добавлено: 06.07.12 22:14
На Windows Web Server 2008 R2 на виртуалке System так же полностью грузит одно ядро - 30%, но общая нагрузка не превышает 50%.

Ответить

Номер ответа: 5
Автор ответа:
 AgentFire



ICQ: 192496851 

Вопросов: 75
Ответов: 3178
 Профиль | | #5 Добавлено: 06.07.12 23:30
давай, agentfire_3

Ответить

Номер ответа: 6
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #6 Добавлено: 07.07.12 00:27
по любому в коде косяк

Ответить

Номер ответа: 7
Автор ответа:
 Programmer



Вопросов: 71
Ответов: 246
 Профиль | | #7 Добавлено: 07.07.12 13:07
Вот код обработки
  1.     class ProcessingClientsTask
  2.     {
  3.         public int Max;
  4.         public int Min;
  5.         public bool Completed;
  6.  
  7.         public ProcessingClientsTask(int min, int max)
  8.         {
  9.             this.Max = max;
  10.             this.Min = min;
  11.         }
  12.     }
  13.  
  14.  
  15.         #region Static processing
  16.  
  17.         static List<TCPClient> AllClients = new List<TCPClient>();
  18.         static ReaderWriterLockSlim AllClientsListLock = new ReaderWriterLockSlim(LockRecursionPolicy.SupportsRecursion);
  19.  
  20.         //#region Static processing
  21.         private static object processingLockObj = new object();
  22.         private static Thread processingThread;
  23.  
  24.         static void ProcessClients(object state)
  25.         {
  26.             var task = (ProcessingClientsTask)state;
  27.             try
  28.             {
  29.                 int min = task.Min;
  30.                 if (min < 0) min = 0;
  31.                 int i = task.Max + 1;
  32.                 while (--i >= min)
  33.                 {
  34.                     if (i >= AllClients.Count) i = AllClients.Count - 1;
  35.                     TCPClient cl;
  36.                     try
  37.                     {
  38.                         cl = AllClients;
  39.                     }
  40.                     catch { continue; } // IndexOutOfRangeException or ArgumentOutOfrAngeException
  41.  
  42.                     try
  43.                     {
  44.                         if (cl.lastFlush.ElapsedMilliseconds >= cl.FlushPeriod) cl.Flush();
  45.  
  46.                         if (!cl.Disposed && cl._needBeginReceive.IsRunning && (cl._needBeginReceive.ElapsedMilliseconds > cl._needBeginReceiveWait))
  47.                         {
  48.                             cl.BeginReceive();
  49.                         }
  50.                     }
  51.                     catch (Exception e)
  52.                     {
  53.                         cl.CallOnException(e);
  54.                     }
  55.                 }
  56.             }
  57.             catch (Exception e)
  58.             {
  59.                 Utils.TraceException("ProcessClients", e);
  60.             }
  61.             finally
  62.             {
  63.                 task.Completed = true;
  64.             }
  65.         }
  66.  
  67.         static void DoProcessing()
  68.         {
  69. #if DEBUG
  70.             Console.WriteLine("TCPClients processing started");
  71. #endif
  72.             StopwatchInt startedAt = StopwatchInt.StartNew();
  73.             while (AllClients.Count != 0)
  74.             {
  75.                 int sleepTime = ProcessingPeriod - startedAt.ElapsedMilliseconds;
  76.                 if (sleepTime < 5) sleepTime = 5;
  77.                 Thread.Sleep(sleepTime);
  78.                 startedAt.Restart();
  79.  
  80.                 int clientsPerThread = ClientsPerThread;
  81.                 if (clientsPerThread <= 10) clientsPerThread = 10;
  82.  
  83.                 //AllClientsListLock.EnterUpgradeableReadLock();
  84.                 try
  85.                 {
  86.                     int i = AllClients.Count - 1;
  87.                     if (i <= clientsPerThread)
  88.                     {
  89.                         ProcessClients(new ProcessingClientsTask(0, i));
  90.                         continue;
  91.                     }
  92.                     var tasks = new List<ProcessingClientsTask>();
  93.                     while (i >= 0)
  94.                     {
  95.                         var task = new ProcessingClientsTask(i - clientsPerThread + 1, i);
  96.                         i -= clientsPerThread;
  97.                         tasks.Add(task);
  98.                         ThreadPool.QueueUserWorkItem(ProcessClients, task);
  99.                     }
  100.                     // wait while all tasks is completed
  101.                     while (true)
  102.                     {
  103.                         foreach (ProcessingClientsTask task in tasks)
  104.                         {
  105.                             if (!task.Completed)
  106.                             {
  107.                                 Thread.Sleep(5);
  108.                                 continue;
  109.                             }
  110.                         }
  111.                         break;
  112.                     }
  113.                 }
  114.                 catch (Exception e)
  115.                 {
  116. #if DEBUG
  117.                     Utils.TraceException(e);
  118. #endif
  119.                 }
  120.             }
  121.             lock (processingLockObj)
  122.             {
  123.                 processingThread = null;
  124.             }
  125. #if DEBUG
  126.             Console.WriteLine("All TCPClients terminated");
  127. #endif
  128.         }
  129.         #endregion
  130.  
  131.  
  132.  
  133.  
  134.         void BeginReceive()
  135.         {
  136.         
  137.             if (this._disposeCalled || (this._socket == null) || (this._receivedDataKeeper.Length > BufferSize))
  138.             {
  139.                 this._needBeginReceive.Restart();
  140.                 return;
  141.             }
  142.  
  143.             this._needBeginReceive.Stop();
  144.  
  145.             try
  146.             {
  147.                 this._socket.BeginReceive(Chunk, 0, ChunkSize, SocketFlags.None, ReceiveCallback, null);
  148.             }
  149.             catch (Exception e)
  150.             {
  151.                 CallOnException(e);
  152.                 Dispose();
  153.             }
  154.  
  155.         }
  156.  
  157.  
  158.         void ReceiveCallback(IAsyncResult ar)
  159.         {
  160.             if (this._disposeCalled) return;
  161.             if (ar.IsCompleted)
  162.             {
  163.                 var deltaTime = this.LastReceiveTime.ElapsedMilliseconds;
  164.  
  165.                 try
  166.                 {
  167.                     SocketError se;
  168.                     int l = this._socket.EndReceive(ar, out se);
  169.                     ReceivedBytes += l;
  170.                     Interlocked.Add(ref  TotalReceivedBytes, l);
  171.                     if (se != SocketError.Success) throw new Exception(se.ToString());
  172.                     LastReceiveTime.Restart();
  173.                     this._lastReceiveDeltaTime = deltaTime;
  174.                     this._lastReceiveLength = l;
  175.  
  176.  
  177.                     #region Call AsyncOnDataReceived
  178.                     if (CallOnReceiveInAsyncMode)
  179.                     {
  180.                         ThreadPool.QueueUserWorkItem(AsyncOnDataReceived);
  181.                     }
  182.                     else
  183.                     {
  184.                         AsyncOnDataReceived(null);
  185.                     }
  186.                     #endregion
  187.  
  188.                 }
  189.                 #region catch-dispose
  190.                 catch (Exception e)
  191.                 {
  192. #if DEBUG
  193.                     Console.Write(" F!ReceiveCallback ");
  194.                     Utils.TraceException(e);
  195. #endif
  196.                     CallOnException(e);
  197.                     Dispose();
  198.                 }
  199.                 #endregion
  200.             }
  201.  
  202.         }
  203.         #endregion
  204.  

Ответить

Номер ответа: 8
Автор ответа:
 Programmer



Вопросов: 71
Ответов: 246
 Профиль | | #8 Добавлено: 07.07.12 13:29
там где начинается курсив, конечно же "cl = AllClients;"

Ответить

Номер ответа: 9
Автор ответа:
 Programmer



Вопросов: 71
Ответов: 246
 Профиль | | #9 Добавлено: 07.07.12 13:29
тьфу) cl = AllClients [ i ] ;

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам