Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.12.28;
Скачать: CL | DM;

Вниз

Как избавиться от 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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.013 c
15-1225305335
sniknik
2008-10-29 21:35
2008.12.28
Как узнать сайты на одном IP адресе?


2-1226831140
ИванН
2008-11-16 13:25
2008.12.28
TListBox + прокрутка


15-1225166445
Slider007
2008-10-28 07:00
2008.12.28
С днем рождения ! 28 октября 2008 вторник


15-1225275082
Petr V. Abramov
2008-10-29 13:11
2008.12.28
наигрались :)


15-1225342704
TRSteep
2008-10-30 07:58
2008.12.28
Органайзер