+  HandyCache форум
|-+  Главная категория» Новые предложения» Ограничение использования ресурсов процессора
Имя пользователя:
Пароль:
Страниц: [1]   Вниз
  Отправить эту тему    Печать  
Автор Тема: Ограничение использования ресурсов процессора  (Прочитано 8388 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Hamlet
Новичок
*

Репутация: +0/-0
Offline Offline

Сообщений: 8


« : 14 августа 2007, 06:10:21 »

Собственно, очередная моя хотелка, заточенная под использование в сети, а не в персональном варианте.

Есть предложение добавить настройку лимитирования использования процессора в %. На серверах может быть критично. При некорректных настройках или по иным причинам (да простят меня разработчики, не смотря на обширный и удачный функционал программы, баги все таки имеются...) НС загребает под себя процессор и память. Ограничение использование памяти тоже не помешало бы, но это, как я понимаю, сложнее, если leak имеется.
Сообщить модератору   Записан
cepera_ang
Beta tester
*****

Репутация: +9/-4
Offline Offline

Сообщений: 355


« Ответ #1 : 14 августа 2007, 19:16:38 »

Не знаю насколько это реализуемо под windows, единственно - могу предложить поставить низкий приоритет процессу НС, тогда даже при большой загрузке другие приложения не будут тормозить.
Сообщить модератору   Записан
Hamlet
Новичок
*

Репутация: +0/-0
Offline Offline

Сообщений: 8


« Ответ #2 : 15 августа 2007, 08:15:02 »

Не знаю насколько это реализуемо под windows, единственно - могу предложить поставить низкий приоритет процессу НС, тогда даже при большой загрузке другие приложения не будут тормозить.
Это реализуемо. Существуют продукты с наличием подобной функции под Windows. Низкий приоритет чреват как раз противоположным эффектом. Если на сервере возникнет ситуация активной загрузки каким либо приложением или службой (не НС), то НС либо прекратит работу, либо пойдут тормоза и различные timeout.
Еще в многопроцессорных (многоядерных) системах можно указывать непосредственно ядро, на котором работать... но это совсем уже шиза имхо Улыбка
Сообщить модератору   Записан
cepera_ang
Beta tester
*****

Репутация: +9/-4
Offline Offline

Сообщений: 355


« Ответ #3 : 15 августа 2007, 08:42:57 »

Мне кажется что реализация такой функциональности требует очень больших затрат, и реализации чего-то подобного собственному планировщику потоков внутри НС, чтобы можно было считать сколько каждый поток занимает тактов из возможных для данного процессора. или я просто слона не замечают Улыбка
Сообщить модератору   Записан
Валерий
Beta tester
*****

Репутация: +3/-0
Offline Offline

Сообщений: 57


Delphi - сила


« Ответ #4 : 24 сентября 2007, 12:12:11 »

Это реализуемо. Существуют продукты с наличием подобной функции под Windows. Низкий приоритет чреват как раз противоположным эффектом.

К сожалению из Вашей персональной информации не возможно узнать профиль Вашей работы.

Поэтому попытаюсь объяснить попроще. В ОСНРВ (операционной системе НЕ реального времени) Windows (начиная с Windows 2000) введён более улучшенный механизм работы с потоками и приложениями (по сравнению с Windows 95-97-Me).  Но этот механизм НЕ позволяет управлять временем, которое забирает на себя процесс.
Приведу пример:
1. для Виндовс 95-97-Ме - бесконечный цикл в теле программы приводил к полному повисанию операционки.
2. для Виндовс 2000 и выше - бесконечный цикл в теле программы приводит к загрузке процессора этой программой до 80-90%, при этом операционка худо-бедно, но работает.
Выход из этой ситуации - добавление в тело цикла всего одной строчки - Application.ProcessMessages (для главного потока приложения) или SLEEP(0) (для порождённых потоков), но эта строка всего лишь даёт понять операционке, что МОЯ программа с циклом живёт и процветает, но просто много жрёт ресурсов.

Простого способа задания для программы % использования процессора не существует - все способы опираются на метод измерения используемого программой % процессорного времени за единицу времени и попыткой ОТДАВАНИЯ своего времени процессора операционке - по простому, это если моя программа использует много процессорного времени (>35% например), то вызвать процедуру SLEEP(0..10..100), но не реже 1 вызова за 3 секунды (например).
Но всё вышеописанное - ИСКУССТВЕННЫЙ способ распределения ресурсов, а НОРМАЛЬНЫЙ способ, присущий всем ОСРВ (операционным системам реального времени, например: *NIX, QNX и т.п.), где управление временем использования процессора реализовано в ядре, в Виндовсе до сих пор не реализовано.

Ну а самое реальное в данном случае - это просто у потоков-соединений у НС выставить приоритет BELOW NORMAL. Как ни странно - но снижение приоритета потока всего на 1 довольно эффективно работает в многопоточных приложениях для распределения ресурсов процессора между этими потоками.

Сорри, если замудренно написал, но так уж привык.
Сообщить модератору   Записан

Arduus animo vincit et prodest !
cepera_ang
Beta tester
*****

Репутация: +9/-4
Offline Offline

Сообщений: 355


« Ответ #5 : 25 сентября 2007, 05:39:34 »

А по-моему дело не в "реальности" или "не реальности" ОС. Те же *NIX не все (по-моему только очень специфические) являются ОСРВ. А Windows планирует не процессы, а потоки, это значит что если у нас есть процесс с 10 потоками, каждый из которых работает непрерывно, и другой процесс с одним потоком (активным), то второй процесс получит всего <10% тактов. Но если приоритет этого потока выше чем всех тех 10, то он получит всё процессорное время. Правда тут еще влияют динамические приоритеты, которые могут изменить соотношение приоритетов. Т.е. например у процесса приоритет - IDLE, но работает таймер (или происходит какое-нибудь событие) - и при каждом тике таймера потоки этого процесса получают "boost", который дает им шанс получить процессорное время.
Примерно так, точнее не помню уже. Так как у НС много потоков и каждый получает данные по сети, то при передаче данных происходит этот самый boost, вот и получается, что динамический приоритет вовсе не ldle...
Сообщить модератору   Записан
Страниц: [1]   Вверх
  Отправить эту тему    Печать  

 
Перейти в: