Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.09.2015, 13:00   #21
Luuzuk
Форумчанин
 
Аватар для Luuzuk
 
Регистрация: 18.01.2012
Сообщений: 975
По умолчанию

Цитата:
Сообщение от coNsept Посмотреть сообщение
з.ы. А с каким промежутком вообще вызывать GC.Collect?
Его вообще вызывать в нормальном приложении не надо. В вашем случае (чтобы посмотреть сколько памяти будет высвобождено) - однократно два раза подряд, и именно тогда, когда приложение уже отъест приличный кусок памяти.
Благодарить в репутацию. Проклинать — туда же
Luuzuk вне форума Ответить с цитированием
Старый 16.09.2015, 13:06   #22
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Сообщение от Luuzuk Посмотреть сообщение
Его вообще вызывать в нормальном приложении не надо. В вашем случае (чтобы посмотреть сколько памяти будет высвобождено) - однократно два раза подряд, и именно тогда, когда приложение уже отъест приличный кусок памяти.
К сожалению у меня был случай когда его вызывать надо было явно.
приложение подобного типа как у ТС, тока там нет работы с БД, там была WebSphereMQ.
и без явного вызова GC.Collect приложение падало от нехватки памяти. добавили только эту строчку и все стало хорошо.
почему так?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 16.09.2015, 13:34   #23
Luuzuk
Форумчанин
 
Аватар для Luuzuk
 
Регистрация: 18.01.2012
Сообщений: 975
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
К сожалению у меня был случай когда его вызывать надо было явно.
приложение подобного типа как у ТС, тока там нет работы с БД, там была WebSphereMQ.
и без явного вызова GC.Collect приложение падало от нехватки памяти. добавили только эту строчку и все стало хорошо.
почему так?
Потому и сделал оговорку о нормальных приложениях (ненормальность тут не обязательно признак низкого качества ПО, а именно отклонение от нормы. в норме .net должна адекватно регулировать потребление памяти, но теория теорией, а практика практикой)

Не знаю почему) Я то приложение не видел, не анализировал, с профайлером памяти над ним не сидел
Благодарить в репутацию. Проклинать — туда же
Luuzuk вне форума Ответить с цитированием
Старый 16.09.2015, 14:41   #24
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию

Главное событие куда поступают все сообщения

Код:
  private static void SmppServerEvClientSubmitSm(object sender, SmppServerClient client, SubmitSm submitSm)
  {
   try
   {
    var smppServer = (SmppServer)sender;

    if (submitSm.Concatenation != null)
    {
     submitSm.Tag = smppServer.Port;

     messageComposer.AddMessage(submitSm);
    }
    else
    {
     long destAddr;

     long.TryParse(submitSm.DestAddr, out destAddr);

     DbLayer.ProcessSubmitSm(submitSm.Client.SystemID, smppServer.Port, destAddr, submitSm.DestAddrTon, submitSm.DestAddrNpi, 
submitSm.SourceAddr, submitSm.SourceAddrTon, submitSm.SourceAddrNpi, submitSm.MessageText, submitSm.DataCoding.ToString(), 
submitSm.RegisteredDelivery, Guid.NewGuid());
    }
   }
   catch (Exception ex)
   {
    DbLayer.AddToLog("EXCEPTION", "Controller::SmppServerEvClientSubmitSm", ex.Message, ex.StackTrace, ex.Source);
   }
  }
Событие MessageComposerOnEvFullMessageRecei ved вызывается когда приходят все кусочки смс (речь идет о смс сообщениях)
Вызывает его messageComposer.AddMessage(submitSm ); внутреняя реализация знает когда приходят все части смс и дергает событие.

Код:
private static void MessageComposerOnEvFullMessageReceived(object sender, MessageEventHandlerArgs args)
  {
   try
   {
    var submitSm = (SubmitSm)args.Parts[0];
    var portNumber = (int)submitSm.Tag;

    long destAddr;
    long.TryParse(submitSm.DestAddr, out destAddr);

    DbLayer.ProcessSubmitSm(submitSm.Client.SystemID, portNumber, destAddr, submitSm.DestAddrTon, submitSm.DestAddrNpi,
 submitSm.SourceAddr, submitSm.SourceAddrTon, submitSm.SourceAddrNpi, args.Text, submitSm.DataCoding.ToString(), 
submitSm.RegisteredDelivery, Guid.NewGuid());
   }
   catch (Exception ex)
   {
    DbLayer.AddToLog("ERROR", "Controller::MessageComposerOnEvFullMessageReceived", ex.Message, ex.StackTrace, ex.Source);
   }
  }
ADO

Код:
  public static async void ProcessSubmitSm(string systemId, int portNumber, long destAddr, byte destAddrTon, byte destAddrNpi, 
string sourceAddr, byte sourceAddrTon, byte sourceAddrNpi, string messageText, 
string dataCoding, byte registeredDelivery, Guid clientMessageId)
  {
   using (var sqlConnection = new SqlConnection(ConnectionString))
   {
    using (var sqlCommand = new SqlCommand("sp_ProcessSubmitSm", sqlConnection))
    {
     try
     {
      sqlCommand.CommandType = CommandType.StoredProcedure;
    
      sqlCommand.Parameters.AddWithValue("@systemId", systemId);
      sqlCommand.Parameters.AddWithValue("@portNumber", portNumber);
      sqlCommand.Parameters.AddWithValue("@destAddr", destAddr);
      sqlCommand.Parameters.AddWithValue("@destAddrNpi", destAddrNpi);
      sqlCommand.Parameters.AddWithValue("@destAddrTon", destAddrTon);
      sqlCommand.Parameters.AddWithValue("@sourceAddr", sourceAddr);
      sqlCommand.Parameters.AddWithValue("@sourceAddrNpi", sourceAddrNpi);
      sqlCommand.Parameters.AddWithValue("@sourceAddrTon", sourceAddrTon);
      sqlCommand.Parameters.AddWithValue("@messageText", messageText);
      sqlCommand.Parameters.AddWithValue("@dataCoding", dataCoding);
      sqlCommand.Parameters.AddWithValue("@registeredDelivery", registeredDelivery);
      sqlCommand.Parameters.AddWithValue("@clientMessageId", clientMessageId);
      
      sqlConnection.Open();

      await sqlCommand.ExecuteNonQueryAsync();

//       .ContinueWith(task =>
//       {
//        if (task.IsCompleted)
//        {
//         
//        }
//       });
     }
     catch (Exception ex)
     {
      AddToLog("EXCEPTION", "DbLayer::ProcessSubmitSm", ex.Message, ex.StackTrace, ex.Source);
     }
    }
   }
  }

Последний раз редактировалось Stilet; 16.09.2015 в 14:58.
coNsept вне форума Ответить с цитированием
Старый 16.09.2015, 15:00   #25
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
using (var sqlConnection = new SqlConnection(ConnectionString))
А зачем каждый раз подключение делать? О_о
Я не понимаю, почему одно подключение нельзя сделать?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 16.09.2015, 15:07   #26
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию

Хм, то есть сделать SqlConnection глобальным и не делать ему Dispose?

Я еще пул использую
Код:
 <connectionStrings>
  <add name="SMS_NOTIFICATION_SERVER_CONNECTION_STRING" connectionString="Data Source=VICTOR\MSSQLUNIFUN;
Initial Catalog=SMS_NOTIFICATION_SERVER_NA;Persist Security Info=True;Trusted_Connection=true;User ID=sa;
Password=QAZxcv321;Max Pool Size=100;" providerName="System.Data.SqlClient"/>
 </connectionStrings>
Сделал вот такую примочку но ограничил поступления входящих сообщений до 150 в секунду и заметил что память подчищается.
Код:
var memoryCollect = new Timer
    {
     Enabled = true,
     Interval = 1000 * 60
    };

   memoryCollect.Elapsed += (sender, args) =>
    {
     GC.Collect();
     GC.WaitForPendingFinalizers();
     GC.Collect();
    };

   memoryCollect.Start();

Последний раз редактировалось Stilet; 16.09.2015 в 15:52.
coNsept вне форума Ответить с цитированием
Старый 16.09.2015, 15:16   #27
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
то есть сделать SqlConnection глобальным и не делать ему Dispose?
Ну да. или у тебя там настолько крутые задачи, что требуют полного распарралеливания?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 16.09.2015, 15:18   #28
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

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

А с помощью профайлера поизучать пробовали? DotMemory например.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 16.09.2015, 15:19   #29
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию

Ну просто есть еще несколько событий которые выполняют примерно такую же роль что и событие по входящим сообщениям, не буду вдаваться в подробности, но они собственно тоже пишут в базу.
Но на сколько я знаю, даже при диспоузе подключение не закрывается а помещается в пул.

Если можно приведите пожалуйста пример того что ты вы имели в виду, так будет яснее.
Цитата:
Так если у вас потоки создаются, то работа с одним объектом из кучи потоков вряд ли чем-то хорошим закончится.

А с помощью профайлера поизучать пробовали? DotMemory например.
Профайлером смотрел от Red Gate ANTS memory profiler. Растет GC heap 0

Вот что говорит red gate http://prntscr.com/8gysgp

з.ы. На текущий момент при раскладе 300-400 сообщений в сек.

Последний раз редактировалось Stilet; 16.09.2015 в 15:52.
coNsept вне форума Ответить с цитированием
Старый 16.09.2015, 16:05   #30
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

В DotMemory вроде бы больше полезной инфы.
Например, классы показывает.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
утечка памяти polin11 Общие вопросы C/C++ 10 18.08.2015 18:12
Утечка памяти Juffin Общие вопросы Delphi 3 02.11.2010 12:11
Анимация (большая Нагрузка на процессор) BuT@JL Мультимедиа в Delphi 6 24.08.2009 09:43
Преобразование типов - большая нагрузка на ЦП ArtUrlWWW Общие вопросы .NET 1 19.05.2009 14:41
утечка памяти в С++ vengo Общие вопросы C/C++ 9 10.06.2008 21:24