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

Вниз

Возможные глюки при 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.53 MB
Время: 0.042 c
3-1152171333
Maverick
2006-07-06 11:35
2006.09.10
TADOQuery+output параметры


15-1155654600
Parus
2006-08-15 19:10
2006.09.10
HTML


2-1156348469
NikIta88
2006-08-23 19:54
2006.09.10
Не убивается таймер после цикла сообщений


3-1152081560
Konrads
2006-07-05 10:39
2006.09.10
Ошибка при попытке открыть базу Access


15-1156085949
vajo
2006-08-20 18:59
2006.09.10
Автовключение компьютера.





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский