Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.12.28;
Скачать: [xml.tar.bz2];

Вниз

Как избавиться от 100% загрузки CPU? 5Мб лога в секунду.   Найти похожие ветки 

 
SkyN   (2008-11-18 11:39) [0]

Cейчас:
Программа1 посылает данные для лога (5 Мб (45 тыс.сообщений) в секунду) по средствам SendMessage(ExternalTraceWindows,WM_COPYDATA,
Программа2, в основном потоке получает данные, и накопив их (сейчас копит 1 Мб) во втором потоке пишет их в файл.

Возможно, есть менее ресурсоемкий способ передачи данных, чем WM_COPYDATA.
Возможно, есть не ресурсоемкий способ сжатия данных. Лог очень однородный, rar сжимает его в 1000 раз.
Возможно, есть другие идеи у Вас.

Программа1
procedure Send(const Msg: String);
var
 aCopyData: TCopyDataStruct;
begin
 aCopyData.dwData := 0;
 aCopyData.cbData := StrLen(PChar(Msg)) + 1;
 aCopyData.lpData := PChar(Msg);
 if ExternalTraceWindows=0 then ExternalTraceWindows := FindWindowEx(0, 0, PChar("TTraceWindow"), PChar("TraceWindow"));
 if SendMessage(ExternalTraceWindows,WM_COPYDATA,0,Longint(@aCopyData))<>777 then begin
   ExternalTraceWindows := FindWindowEx(0, 0, PChar("TTraceWindow"), PChar("TraceWindow"));
   SendMessage(ExternalTraceWindows,WM_COPYDATA, 0,Longint(@aCopyData))
 end;
end;

procedure Log(const Level: Integer; const Msg: String);
var
 S: String;
begin
 if Level<MinLogLevel then exit;
 EnterCriticalSection(OldCriticalSection);
 try
   if OldNow=Now then S := ""
                 else begin
                   DateTimeToString(S,"yyyy.mm.dd hh:mm:ss.zzz",Now);
                   S := S + #13#10;
                   OldNow := Now;
                end;
 finally
   LeaveCriticalSection(OldCriticalSection);
 end;
 if Level=LogError then S := S + "ERROR ";
 if GetCurrentThreadID <> MainThreadId then S := S +"Th#"+IntToHex(GetCurrentThreadId,1)+#9;
 S := S + Msg;
 Send(S);
end;


Программа2

procedure TTraceWindow.WMCopyData(var Msg: TWMCopyData);
begin
 Msg.Result := 777;
 if Assigned(LogThread) then
   LogThread.Add(PChar(Msg.CopyDataStruct.lpData));

 if CheckBox1.Checked then begin
   while Memo1.Lines.Count>100 do Memo1.Lines.Delete(0);
   Memo1.Lines.Add(PChar(Msg.CopyDataStruct.lpData));
 end;
end;

procedure tLogThread.Add(const Msg: PChar);
var
 i: integer;
begin
 CriticalSection.Acquire;
 try
   i := 0;
   While (ASize+i+2)<MaxABSize do begin
     if Msg[i]=#0 then break;
     a[ASize+i] := Msg[i];
     inc(i);
   end;
   a[ASize+i]   := #13;
   a[ASize+i+1] := #10;
   ASize := ASize+i+2;
   if ASize>(MaxABSize div 2) then Event.SetEvent;
 finally
   CriticalSection.Release;
 end;
end;

procedure tLogThread.execute;
                    procedure WriteToFile;
                    var
                      F: file;
                      tmp: PChar;
                    begin
                      if Asize=0 then exit;
                      CriticalSection.Acquire;
                      try
                        tmp := b;
                        b   := a;
                        a   := tmp;

                        Bsize := Asize;
                        Asize := 0;

                        SizeOfLog := SizeOfLog + Bsize;
                        if SizeOfLog > 100*1024*1024 then LogFileName;
                        Event.ResetEvent;
                      finally
                        CriticalSection.Release;
                      end;

                      try
                        if Bsize > 0 then begin
                          AssignFile(F, FileName);
                          {$I-} Reset(F,1); {$I+}
                          if IOResult = 0 then Seek(F, FileSize(F))
                                          else Rewrite(F,1);
                          if IOResult = 0 then BlockWrite(F,B^,Bsize);
                          CloseFile(F);
                        end;
                      except
                        trace("except при записи в файл");
                        LogFileName;
                      end;
                    end;
begin
 while not terminated do begin
   case Event.WaitFor(60000) of
     wrTimeout    : WriteToFile;
     wrAbandoned  : Break;
     wrError      : Break;
     wrSignaled   : WriteToFile;
   end;
 end;
end;



 
Slym ©   (2008-11-18 16:37) [1]

SkyN   (18.11.08 11:39)
45 тыс.сообщений в секунду

это нереально... система только на переключение задач уйму времени убъет если справится :) (один Send - одно переключение)
может имеет смысл и в первой проге не дергаться по каждому чиху а тоже копить?
и вообще сообщения не для этих "транспортных" целей...


 
Sergey13 ©   (2008-11-18 16:51) [2]

> [0] SkyN   (18.11.08 11:39)
> Лог очень однородный

Так может писать только неоднородности? Кому нужны 5метров в секунду с сообщением "все ОК"?


 
SkyN   (2008-11-18 17:18) [3]

> Slym ©   (18.11.08 16:37) [1]
Копить сообщения  в первой проге - попробую.
а как лучше пересылать из проги в прогу, если WM_COPYDATA не для этих целей. Насколько другие способы менее ресурсоемкие?

> Sergey13 ©   (18.11.08 16:51) [2]
ну не просто "все ОК" :) хотя есть и такие сообщения


 
Sergey13 ©   (2008-11-18 17:23) [4]

> [3] SkyN   (18.11.08 17:18)

> ну не просто "все ОК" :)

"все ОК" для примера. Можно писать время изменения параметра и старое/новое значение. Не зная структуры лога тут трудно советовать. Но в любом случае "Лог очень однородный" - это плохой лог. ИМХО.


 
qqq   (2008-11-18 17:33) [5]


> а как лучше пересылать из проги в прогу, если WM_COPYDATA
> не для этих целей.

pipe?


 
Тын-Дын ©   (2008-11-18 21:25) [6]

MMF?


 
Сергей М. ©   (2008-11-18 21:50) [7]


> pipe?


Да , 45 килохлама в секунду - это pipeц.


 
Юрий Зотов ©   (2008-11-18 23:51) [8]

В бытность ЕС ЭВМ снимала у нас ночное машинное время одна контора - ну и я по ночам там же, на нашем ВЦ частенько торчал. Работали от этой конторы 2 программера, бились они над своим детищем, наверное, месяца 2, еженощно - и вот в одну прекрасную ночь выходит один из них из машзала, абсолютно счастливый. И тащит в руках стопку бумаги толщиной так сантиметров 20 (а формат ее, по-нынешнему, где-то А3). И говорит - уррра!!! заррработало!!! Ну я его спрашиваю - а в распечатке-то, такой огромной, что у тебя? Как что, говорит - результаты, конечно. И показывает - а там сплошные цифры, цифры, цифры... на стопке формата А3 толщиной 20 см... Блин, говорю, и что же ты теперь с этими результатами делать-то будешь? Ты понимаешь, что для того, чтобы их обработать, тебе либо жизни не хватит, либо еще одну (а может, и не одну) программу писать надо?

И тут... я даже пожалел, что сказал это. Сначала у него медленно-медленно сползла с лица счастливая улыбка, потом вытянулось само лицо, а потом на нем проступило буквально отчаяние. Понял парень, что же такое он сотворил... что несколько месяцев авральной работы просто зазря пропали.

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


 
Германн ©   (2008-11-19 00:09) [9]


> Если каждую секунду в лог загоняется "Война и мир", то что
> потом с этим логом делать?

Пожинать разумное, доброе, вечное!

P.S.
А рулоны бумаги с числами нам приходилось вручную обрабатывать пока в лаборатории на появилась первая, хм, "эвм" :)


 
Slym ©   (2008-11-19 05:43) [10]

qqq   (18.11.08 17:33) [5]
pipe

+1... у пайпа буфер свой есть он и будет кешировать блокируя потоки только при переполнении/пустоте и если его растянуть на 1 сек данных... то поидее будет минимум переключений
это за 3 с половиной минуты прога рождает гиг инфы... за сутки с небольшим будет засран мой старенький пятисотник? ужос! видео регистратор месяц его заполняет, а ты за сутки :)


 
KilkennyCat ©   (2008-11-19 08:08) [11]

а это вообще возможно? 45 сообщений в миллисекунду? под виндами?


 
Anatoly Podgoretsky ©   (2008-11-19 08:52) [12]

> KilkennyCat  (19.11.2008 8:08:11)  [11]

всего лишь 40 мегабит в секунду.


 
Дуб ©   (2008-11-19 13:16) [13]

Может он в лог пишет случайную последовательность, которую потом будет продавать?



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2008.12.28;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.006 c
1-1204991269
Kley
2008-03-08 18:47
2008.12.28
Запуск программы по расписанию


15-1225230195
Германн
2008-10-29 00:43
2008.12.28
Спам-боты


15-1225463695
Циркуль
2008-10-31 17:34
2008.12.28
Нашел какую-то фичу (может глюк) в D6...


15-1224872879
Александиров
2008-10-24 22:27
2008.12.28
Термин ИВТ


3-1212520135
Белочка
2008-06-03 23:08
2008.12.28
Запрос в ADOQuery





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский