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

Вниз

Возможные глюки при 100% загрузке процессора   Найти похожие ветки 

 
DVM ©   (2006-08-18 11:22) [0]

Есть некая программа. Программа пишет на диск в 20-40 открытых файлов. Пишет постоянно, по мере поступления данных. При запуске оной на компьютере достаточной мощности все нормально.
При запуске на слабом компьютере при загрузке 100% спустя несколько часов начинаются проблемы - "Недостаточно виртуальной памяти" - все останавливается.
Хочу выяснить - проблема все же в програме или так и должно быть при 100% загрузке.
Мое предположение, что из-за недостатка процессорного времени система откладывает и откладывает запись во временный буфер, но записать спустя время все равно не успевает. Это так?
Или все же это проблема программы?


 
boriskb ©   (2006-08-18 11:26) [1]

Проверь свое предположение.
Периодически принудительно сбрасывай буфер в файл


 
Ketmar ©   (2006-08-18 11:26) [2]

это memory leak.


 
Kolan ©   (2006-08-18 11:28) [3]


> "Недостаточно виртуальной памяти"

Процессор то тут причем.. скорее всего файлы разростаются в размере, а ты их в памяти держишь....


 
Чапаев ©   (2006-08-18 11:31) [4]

Ну ведь если запускать при малой загрузке проца, то проблемы не видно...


 
DVM ©   (2006-08-18 11:32) [5]


> это memory leak.

Почему проявляется только при 100% загрузке на слабых машинах?
Ни объекты, ни память, ни дискрипторы (счетчики) не растут во время работы программы.

> Периодически принудительно сбрасывай буфер в файл

Я попробую использовать флаг FILE_FLAG_WRITE_THROUGH в CreateFile - может поможет. Ждать только долго надо. Эмуляция ситуации на мощной машине не получается. Даже если я проц гружу на 100 процентов.

> Процессор то тут причем.. скорее всего файлы разростаются
> в размере, а ты их в памяти держишь....

Почему в памяти? На диск пишутся. Порциями и небольшими.


 
cyborg ©   (2006-08-18 11:35) [6]

Может на слабой тачке ОС другая? Последние версии всяко лучше работают.


 
Ketmar ©   (2006-08-18 11:36) [7]

> [4] Чапаев ©   (18.08.06 11:31)
сильно подозреваю, что на мощном компе просто памяти побольше. %-)


 
Чапаев ©   (2006-08-18 11:37) [8]

> Я попробую использовать флаг FILE_FLAG_WRITE_THROUGH в CreateFile
> - может поможет. Ждать только долго надо. Эмуляция ситуации
> на мощной машине не получается. Даже если я проц гружу на
> 100 процентов.

А на эмуляторе? Памяти поменьше...

Хотя, в принципе, и на реальной машинке с BURMMEMORY поиграться можно, сразу машинка "ослабеет". ;-)


 
DVM ©   (2006-08-18 11:39) [9]


> сильно подозреваю, что на мощном компе просто памяти побольше.

Нет, дело не в этом. Памяти одинаково.
На мощном компьютере программа работает сутками без проблем.
И см. [5]
> Ни объекты, ни память, ни дискрипторы (счетчики) не растут
> во время работы программы


 
DVM ©   (2006-08-18 11:44) [10]

Вот процедура записи на диск:
Добавляет данные в два открытых файла (файл данных и индексный файл, подробнее объяснять не буду, нет смысла и из кода понятно).
Ранее указанные файлы созданы другой процедурой.


function TScene.WriteFrame(const Buffer: PChar; Count: Cardinal): boolean;
var
 dwPointer: DWORD;
 NumberOfBytes: Cardinal;
 sz: Int64;
 st: TDateTime;
begin
 Result := false;
 if FVideoFileHandle <> INVALID_HANDLE_VALUE then
   begin
     sz := FSize;
     dwPointer := SetFilePointer(FVideoFileHandle, Int64Rec(sz).Lo, @Int64Rec(sz).Hi, FILE_BEGIN);
     if (dwPointer <> $FFFFFFFF) then
       begin
         if WriteFile(FVideoFileHandle, Buffer^, Count, NumberOfBytes, nil) then
           if NumberOfBytes = Count then
             begin
               FSize := FSize + NumberOfBytes;
               if FIndexFileHandle <> INVALID_HANDLE_VALUE then
                 begin
                   dwPointer := SetFilePointer(FIndexFileHandle, 0, nil, FILE_END);
                   if (dwPointer <> $FFFFFFFF) then
                     begin
                       st := Now;
                       sz := FSize;
                       if WriteFile(FIndexFileHandle, st,  8, NumberOfBytes, nil) then
                         if NumberOfBytes = 8 then
                           begin
                             FIndexSize := FIndexSize + NumberOfBytes;
                             if WriteFile(FIndexFileHandle, sz,  8, NumberOfBytes, nil) then
                               if NumberOfBytes = 8 then
                                 begin
                                   FIndexSize := FIndexSize + NumberOfBytes;
                                   Result := true;
                                 end;
                           end;
                     end;
                 end;

             end;
       end;
   end;

end;


 
Ketmar ©   (2006-08-18 11:51) [11]

гы. так это ещё и работа с видео? %-)
вообще, может быть, что винде просто не хватает времени на растусовку страниц в своп, и она поступает умно -- увеличивает своп. %-)


 
Чапаев ©   (2006-08-18 11:54) [12]

> FIndexSize := FIndexSize + NumberOfBytes;

Это так и задумано? Записываешь дважды, IndexSize наращиваешь один раз. Хотя, конечно, это вряд ли относится к решаемой проблеме...


 
Чапаев ©   (2006-08-18 11:54) [13]

Тьфу. Предыдущий пост не читайте, пожалуйста...


 
DVM ©   (2006-08-18 11:58) [14]


> Ketmar ©   (18.08.06 11:51) [11]

Не совсем с видео, но что-то в этом духе.
Обработкой видеопоследовательностей программа не занимается. Ее дело принять видеопоток с HTTP сервера и записать. Т.е нагрузку создает только сеть и запись на диск.
Все это проверяется на очень своеобразном копьютере с процессором VIA 533 Мгц.


 
Ketmar ©   (2006-08-18 11:58) [15]

> [13] Чапаев ©   (18.08.06 11:54)
поздняк. я уже... %-)


 
Ketmar ©   (2006-08-18 11:59) [16]

> [14] DVM ©   (18.08.06 11:58)
честно говоря, никогд так процессор не загружал. дома попробую, если не забуду и не лень будет. %-)


 
tesseract ©   (2006-08-18 12:00) [17]


>  Т.е нагрузку создает только сеть и запись на диск.


Если не диск, то возможно сеть и глючит.


 
DVM ©   (2006-08-18 12:03) [18]


> Если не диск, то возможно сеть и глючит.

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


 
tesseract ©   (2006-08-18 13:43) [19]


> DVM ©   (18.08.06 12:03) [18]


Есть некое предположение, что просто глючит дисковый кэш.......
а оперативки добавить никак?


 
Desdechado ©   (2006-08-18 13:54) [20]

> а оперативки добавить никак?
Отодвинуть появление проблемы на пару суток?


 
tesseract ©   (2006-08-18 14:05) [21]


> Desdechado ©   (18.08.06 13:54) [20]


не факт, ой не факт.


 
Мефисто   (2006-08-18 19:16) [22]


> tesseract ©   (18.08.06 13:43) [19]



> Есть некое предположение, что просто глючит дисковый кэш.
> ......


Растет не по дням, а по часам?


 
tesseract ©   (2006-08-19 14:22) [23]

> [22] Мефисто   (18.08.06 19:16)


не успевает сброситься :-)  на диск. Такое бывает.


 
Пусик ©   (2006-08-19 14:48) [24]

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


> DVM ©   (18.08.06 11:32) [5]



>Я попробую использовать
> флаг FILE_FLAG_WRITE_THROUGH в CreateFile - может поможет.
>  Ждать только долго надо. Эмуляция ситуации на мощной машине
> не получается. Даже если я проц гружу на 100 процентов.


А просто во время работы периодически вызывать функцию FlushFileBuffers не пробовал?

Также можно попробовать заставить систему писать на диск в режиме ядра, используя порты завершения ввода/вывода.


 
isasa ©   (2006-08-19 15:13) [25]

А вспомнить, для примера, клиента пиринговых сетей. Например, того-же eMule. Один коннект, один поток с записью в файл по карте закачки.
По-умолчанию - число соединений ~300. Работает и 600 на, отнюдь, не выдающейся машине (Sempron 2800+, IDE HDD Maxtor).
Освобождать ресурсы надо вовремя. Процессор и диск здесь ни при чем.


 
tesseract ©   (2006-08-19 19:18) [26]

> [24] Пусик ©   (19.08.06 14:48)


Это тоже к месту, возможно отображаемые файлы помогут. Т.К  имхо дело именно в способе открытия файлов. Как правило при больших объёмах их лучше именно отображать.


 
DVM ©   (2006-08-19 23:42) [27]


> А вспомнить, для примера, клиента пиринговых сетей.

Неудачное сравнение. Потоков записи на диск то у него много, да только скорости маленькие.
У меня 150-200 кбайт сек на коннект. При этом таких конеектов 25 допустим. Кроме того данные надо принять, проверить корректность, декодировать.

> Работает и 600 на, отнюдь, не выдающейся машине (Sempron
> 2800+, IDE HDD Maxtor).

Сравнил божий дар с яичницей. Я проверяю на VIA 533. Это раз в 50 медленнее будет ИМХО.


 
DVM ©   (2006-08-19 23:45) [28]


> Освобождать ресурсы надо вовремя.

Читайте предыдущие мои посты. Ни память, ни дискрипторы, ни объекты никакие НЕ РАСТУТ во время выполнения программы. Я специально даже стал вести лог ради этого. Просто в один момент появляется сообщение Не хватает виртуальной памяти.


 
DVM ©   (2006-08-19 23:48) [29]


> > Освобождать ресурсы надо вовремя.

Почему проявляется только при дительной 100% загрузке?
Если загрузку сделать, скажем, 70% глюк не возникнет никогда. Я неделю ждал специально.



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

Текущий архив: 2006.09.10;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.032 c
15-1155584405
ronyn
2006-08-14 23:40
2006.09.10
Как создать приложение под разные ОС


2-1155916392
kami
2006-08-18 19:53
2006.09.10
Коннект 2-х TServerSocket


3-1151498384
Serjio77
2006-06-28 16:39
2006.09.10
Выгрузка из файла xml для чайника...


1-1153902869
DmitryK
2006-07-26 12:34
2006.09.10
Работа с RTF


15-1155600642
Админ
2006-08-15 04:10
2006.09.10
Должен ли будущий админ изучать математику, ТОЭ и физику?