Информация в этой статье применяется к:
Этот документ содержит информацию, относящуюся к 16-битным, 32-битным и DOS-приложениям.
Часто приложения DOS используют процессор на 100%. Это присходит потому, что они постоянно опрашивают клавиатуру, даже если кажется, что они ничего не делают. Для избежания этой проблемы вы можете использовать утилиту DOSKBD.
DOSKBD настраивает алгоритм обнаружения опроса клавиатуры для определенного окна MS-DOS. После выбора оптимального значения вы можете создать пакетный файл, в котором DOSKBD автоматически запускается при запуске приложения.
Для увеличения числа одновременных пользователей применяется алгоритм агрессивного опроса клавиатуры. Это обеспечивает меньшее использование процессора приложениями, слишком часто проверяющих клавиатуру в течении одного такта системного таймера. Существуют значения по умолчанию; однако, оптимальные значения зависят от конкретного проиложения DOS. В этом документе описано, как настроить алгоритм опроса клавиатуры.
Синтаксис
doskbd /defaults [/q]
doskbd [/detectprobationcount:nnn] [/inprobationcount:nnn] [/
msallowed:nnn] [/mssleep:nnn] [/busymsallowed:nnn] [/
msprobationtrial:nnn] [/msgoodprobationend:nnn] [
/detectioninterval:nnn] [/startmonitor [appname] | /stopmonitor] [/q]
Параметры
Допустимый диапазон значений всех аргументов - от 0 до 32767.
/defaults
Сброс всех параметров настройки в их значения по умолчанию.
/detectprobationcount:nnn
Число просмотров (peeks) в течении системного такта, необходимое
для перевода приложения в режим апробации (probation state) и
поместить приложение в сон (по умолчанию 80)
/inprobationcount:nnn
Число просмотров (peeks) в течении системного такта, необходимое
для перевода приложения в сон, когда оно находится в режиме
апробации. Это значение не должно превышать значение
detectprobationcount. Значение по умолчанию 35.
/msallowed:nnn
Число миллисекунд, в течении которых приложению допускается находится в
состоянии апробации перед тем, как оно будет помещено в сон.
Значение по умолчанию 0.
/mssleep:nnn
Число миллисекунд, на которое приложение погружается в сон
(по умолчанию 100).
/busymsallowed:nnn
Если приложение детектируется как "busy" (занято), оно не может быть
помещено в состояние апробации в течении этого числа миллисекунд
(по умолчанию 60).
/msprobationtrial:nnn
Когда приложение находится в состоянии апробации, вместо inprobationcount
используется detectprobationcount каждые
msprobationtrial миллисекунд (по умолчанию 2500).
/msgoodprobationend:nnn
Когда приложение находится на апробации, следует избегать помещать
его в сон на это число миллисекунд, чтобы дать время выйти из
апробации (по умолчанию 2500).
/detectioninterval:nnn
Временной интервал (в тактах таймера), используемый для подсчета
событий опроса клавиатуры.
/StartMonitor [appname]
Запускает программу appname и собирает статистику опроса клавиатуры.
/StopMonitor
Остановка сбора статистики.
/q
Подавляет вывод на экран информации об осуществляемых действиях.
Замечания о DOSKBD
Команда DOSKBD меняет значения по умолчанию для одного сеанса DOS.
Каждый сеанс DOS может иметь свои собственные настройки.
Для определения текущих настроек введите с командной строки
команду DOSKBD.
DOSKBD определяет, насколько часто в течении времени обнаружения случаются опросы клавиатуры. Если в период обнаружения случается слишком много опросов клавиатуры, приложение помещается в состояние апробации и пригодно для паузы на некоторый интервал времени. Когда приложение находится состоянии апробации, плгоритм можно настроить на приостановку приложения после некоторого числа опросов клавиатуры. Приложения могут осуществлять какие-то действия, которые заставляют систему помечать такие приложения как "занятые" (busy); в этом случае приложение выводится из состояния апробации. Если приложение обнаружено "занятым", оно "пробуждается". Примерами ситуаций, когда приложение может стать "занятым", являются обновления экрана, файловые операции, ввод с клавиатуры или мыши.
Если приложение опрашивает клавиатуру detectprobationcount раз в течении заданного итервала обнаружения, и прошло busymsallowed число миллисекунд спустя последнего обнаружения приложения как занятого, приложение снова помещается в состояние апробации.
Если приложение превысило допутимое число опросов в пределах интервала обнаружения после того, как пребывало в состоянии апробации в течении msallowed миллисекунд, оно приостанавливается на время mssleep миллисекунд.
Когда приложение находится в состоянии апробации, число допустимых опросов уменьшается до inprobationcount. Если оно превышает допустимое число опросов и если прошло msallowed миллисекунд после первой апробации, приложение приостанавливается.
Приложение выводится из апробации, если прошло msgoodprobationend мс. после приостановки приложения. Кроме того, каждые msprobationtrial мс. допутимосе число опросов в интервале обнаружения увеличивается до detectprobationcount. Пока приложение не приостановлено, допустимое число ропросов остается на высоком уровне. Если приложение превышает этот уровень, допустимый уровень уменьшается до inprobationcount.
Если DOSKBD запускается без параметров, она выводит текущие установки.
Примеры DOSKBD
При настройке параметров, сначала запустите неактивную систему
с пользователем на консоли и удаленным пользователем. Только эти два
пользователя должны быть в системе. Вы можете использовать DOSKBD для генерации статистики,
чтобы получить базовые значения параметров
detectprobationcount, inprobationcount и detectioninterval
с помощью опции
/startmonitor. (DOSKBD /STARTMONITOR
[appname] запускает сбор статистики).
Запустите Performance Monitor с консоли, а DOS приложение - удаленно.
Настройте
Performance Monitor для вывода показателя "system CPU%" каждую
секунду.
Пример
В этом примере программа DOS нормально работает в однопользовательском режиме, но система сильно замедляется, когда программу исопьзуют несколько пользователей. В этом сценарии, возможно, алгоритм определения недостаточно агрессивен, чтобы перевести приложение в состояние апробации. Засеките, сколько процессора потребляет приложение в состоянии покоя и когда оно что-то делает. Выйдите из приложения и используйте DOSKBD для настройки параметров опроса. Укажите новые параметры в командной строке. Эти новые параметры будут применяться только к тому окну MS-DOS, в котором вы запустили DOSKBD. В каждой попытке изменяйте параметры приблизительно на 30%.
Этот сценарий более агрессивно отбирает CPU от приложения. Прежде всего попытайтесь уменьшить значения detectprobationcount и inprobationcount. Если это не помогает, попробуйте уменьшать busymsallowed на 10 ms в каждой попытке. Значение по умолчанию для msallowed уже 0. Если все нормально, использование CPU должно быть намного меньше 100% Начиная с этого момента очень важно обеспечить правильное функционирование приложения. Если оно стало работать плохо, вам следует немного увеличить одно или несколько значения. Для дальнейшего уменьшения использования CPU, увеличьте значение mssleep. При этом соблюдайте осторожность, поскольку некоторые программы могут перестать отвечать или работать рывками, если значение слишком велико.
Теперь система может поддерживать большее количество пользователей. Некоторые приложения все равно потребляют около 100% CPU независимо от агрессивности алгоритма определения опроса клавиатуры. Вероятно, эти приложения не опрашивают клавиатуру, а делают что-то другое, что заставляет помечать их как "занятые" слишком часто.
Стратегия использования DOSKBD
Для каждого приложения следует отдельно настраивать DOSKBD. Используйте Performance Monitor для оценки влияния изменения параметров DOSKBD
/DetectProbationCount:1 /InProbationCount:1 /msSleep:10,000 /BusymsAllowed:1
/DetectProbationCount:10,000 /InProbationCount:10,000 /msSleep:1 /BusymsAllowed:10,000
амечания
Вы можете использовать редактор PIF для создания иконки, запускающей нужное приложение DOS.
Вы можете создать собственный файл Autoexec.bat,
запускающий DOSKBD с оптимизированными параметрами.
Обратитесь к поставщику программы, чтобы выяснить, что еще нужно
сделать, чтобы запустить ее в среде
Windows NT 3.51/4.0; например, можно установить параметры
BUFFERS= и FILE= в файлах Autoexec.nt или Config.nt
Используйте команду START для запуска приложения
с командной строки с более высоким приоритетом
Это может оказать побочное влияние на общую производительность. Будьте крайне осторожны при использовании этих параметров. Это можно использовать только для DOS-приложений.
Вызывает ли приложение другой процесс или программу? Например, Btrieve? Какая версия? NLM на сервере Netware или Breqnt.exe на сервере Citrix?
А может, DOS-приложение написано с использованием Cobol Run-time? Они пробовали следующее?
Установите флаг совместимости, чтобы Winframe вместо имени компьютера возвращал имя пользователя. Задержка может быть связана с блокировкой для предотвращения одновременного изменения записи разными пользователями.
Создайте ключ реестра в ветке
HEY_LOCAL_MACHINE\SOFTWARE\Citrix\Compatibility\Applications.
В качестве имени ключа используйте имя приложения (без расширения).
Создайте значение в этом ключе с именем
Flags (тип REG_DWORD) и присвойте ему значение 0x1C.
Поноэкранные приложения DOS не открываются в сеансе ICA. Они не поддерживаются в сеансах Windows 2000. Это также справдливо для соединений RDP.
Некоторые приложения, нормально работающие в Windows NT 4.0 TSE, при работе в Windows 2000 TS потребляют 100% CPU. Microsoft удалила определение "плохих приложений" из Windows 2000. Ищите на Microsoft hotixes на предмет специфичных приложений в Windows 2000.
Из справки по Windows 2000:
Windows 2000 Server является 32-битной средой, а Windows 3.11 - 16-битная среда. Windows 2000 Server выполняет 16-битные программы через процесс, называемый "Окно в окне" - Windows on Windows (WOW), транслируя 16-битные программы в расширенном режиме. Этот процесс вызывает потребление 16-битными программами дополнительных системных ресурсов. Запуск 16-битных программ на терминальном сервере может уменьшить количество поддерживаемых одновременных пользователей на 40% и увеличить объем используемой памяти на 50%. По этой причине по возможности используйте только 32-разрядные программы.
Некоторые программы, активно выводящие на экран, могут уменьшить производительность. Выключите всевозможные видеоэффекты.
Microsoft специально не тестировала и не поддерживает DOS-приложения в Terminal Server и рекомендует заменять их 32-разрядными Windows-аналогами.
DOSKBD не работает в Windows 2000
Для Windows 2000 такой утилиты не существует, а версия для
Windows NT 4.0 не работает в
Windows 2000. Поэтому использование DOSKBD ограничивается только
Windows NT Server 4.0, Terminal Server Edition. Подробнее
читайте статью Microsoft Q257966
Вместо DOSKBD можно попробовать использовать утилиту TAME, которая позволяет более эффективно перераспределять ресурсы в многозадачной среде
Одна программа на Clipper может потреблять до 100% CPU за счет активного опроса клавиатуры. Вы можете применить "заплатку" к программам, написанных на Clipper 5.x. Этот патч разработан компанией Datapac Australasia, Ltd., которая теперь является частью Citrix Systems, Inc..
Эта заплатка вставляет вызов особождения CPU ("Release CPU") в клавиатурный цикл. Он использует вызов INT 2F Function 1680. Этот вызов поддерживается в DOS (5.0+), OS/2 (WinView) и Windows NT (WinFrame). С этой заплаткой в коде программа на Clipper отдает CPU время для других задач.
Для установки заплатки, разработан скрипт
PATCHA. Запустите этот скрипт на каждой программе
Clipper для изменения ее исполняемого кода.
Clip2F.exe по адресу:
ftp://ftp.citrix.com/Utilities/Clip2F.exe
Clip2f.pat, указав в нем
имя исполняемого файла Clipper-программы.
Измените строку 14 файла Clip2f.pat:load Program.exe, где Program.exe имя исполняемого файла Clipper-программы.
Clip2f.pat и запустите следующую команду:
PATCHA CLIP2FЭта команда патчит программу, вставляя вызов "Release CPU".
Инсталляция
Использование
FoxPro for Windows работает не как обычное приложение Windows, поскольку
не использует стандартные средства Windows для отображения окон, кнопок
и пр. Он работает скорее как DOS-приложение. Окно в нем фомируется
как картинка в видеобуфере. При любом изменении в картинке она целиком
выводится на экран. Это вызывает медленную прорисовку некоторых диалоговых
окон. Для решения этой проблемы есть утилита Foxpfix.exe
foxpfix /disable.
16-разрядная подситема не изменилась при переходе от WinFrame к MetaFrame, поэтому все рассуждения и решения остаются. Например, если два 16-разрядных приложения работают в одном сеансе, и одно из них зависает, второе тоже зависнет. Этого можно избежать, включив опцию Run In Separate Memory Space. Если два приложения работают в разных сеансах, 16-разрядные приложения не влияют друг на друга.
Один из простейших способов улучшить производительность в терминальной среде - это запретить фоновые обои. Опубликованные приложения автоматически запрещают обои.
Очередь клаиатуры и мыши на клиенте ICA
Citrix ICA Client помещает данные клаватуры и мыши в очередь для уменьшения количества передаваемых пакетов. Это полезно на медленных линиях, но в локальной сети выключение буферизации событий клавиатуры и мыши ускоряет реагирование приложений.
Выключение очереди клавиатуры и мыши увеличивает число посылаемых пакетов. Это нежелательно в WAN.
Вы можете переключать очереди индивидуально для каждого соединения в Remote Application Manager.
Меняйте биты совместимости только в том случае, если приложение неправильно работает. Разные биты отвечают за приложение, регистр, INI-файл. Биты совместимости хранятся:
Существует три разных ключа для приложений, файлов INI и реестра. Значения по умолчанию подходят для большинства приложений, но последующая настройка возможна с помощью установки битов совместимости, описанных ниже.
Первый набор битов совместимости означает версию приложения, для которого они применяются. Не все комбинации полезны; например, приложения DOS никогда не обращаются к реестру. Поскольку путь к файлу не указывается, а многие приложения могут использовать одно и то же имя (например, setup.exe), указание типа приложения обеспечивает применение настроек к нужному приложению.
Сложите нужные значения бит для получения итогового значения. Например, чтобы для 16- и 32-разрядной версии MyApp.exe вместо имени компьютера возвращалось имя пользователя, создайте ключ \\HKEY_LOCAL_MACHINE\SOFTWARE\Citrix\Compatibility\Applications\MYAPP.
- или -
Создайте ключ \\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\TerminalServer\Compatibility\Applications\MYAPP.
Добавьте значение с именем Flags, тип REG_DWORD, содержащий 16-ричное значение 11C (сумма 0x4 для 16-разрядных приложений Windows, 0x8 для 32-разрядных приложений Windows, 0x10 чтобы возвращать имя пользователя, и 0x100 для запрета отображения (mapping) реестра.Ключи совместимости, Приложения
Prog1.exe, appname будет Prog1).
WinFrame содержит следующие ключи реестра для настройки приложений Windows. Их имена и значения по умолчанию:
FirstCountMsgQPeeksSleepBadApp = 0xF MsgQBadAppSleepTimeInMillisec = 0x1 NthCountMsgQPeeksSleepBadApp = 0x5 Flags = 0x8Копия этих значений содержится в \Compatibility\Applications\SETUP
FirstCountMsgQPeeksSleepBadApp.
Сколько раз приложение наблюдает очередь сообщений перед тем,
как решить, что оно "плохое". Уменьшение этого значения чаще
погружает приложение в сон, и оно потребляет меньше ресурсов CPU.
MsgQBadAppSleepTimeInMillisec
Число миллисекунд, на которое приложение погружается в сон, если
оно признано "плохим". Увеличение этого значения заставляет
приложение потреблять меньше CPU.
NthCountMsgQPeeksSleepBadApp
Сколько раз приложение наблюдает очередь сообщений после того,
как оно определено как "плохое" и должно быть снова погружено в сон.
Уменьшение этого значения заставляет
приложение потреблять меньше CPU.
Flags
Определяет тип приложения, к которому будут применены флаги
"плохих" приложений.
Значение 0x8 для 32-разрядных приложений, 0x4 для 16-разрядных,
0xC для 16- и 32-разрядных приложений одновременно.
| Приложение DOS | 0x1 |
| Приложение OS/2 | 0x2 |
| 16-разрядное приложение Windows | 0x4 |
| 32-разрядное приложение Windows | 0x8 |
| Возвращать имя пользователя вместо имени компьютера | 0x10 |
| Вернуть номер сбоки Citrix | 0x20 |
| Запретить для этого приложения отображение реестра | 0x100 |
| Не подменять каталог WINDOWS каталогом пользователя | 0x400 |
Используйте "Возвращать имя пользователя вместо имени компьютера"
для тех приложений, которые используют в качестве уникального
идентификатора имя компьютера. В этом случае программе будет
передаваться имя пользователя, давая приложению уникальный идентификатор.
Используйте "Запретить для этого приложения отображение реестра",
чтобы приложение поддерживало только одну глобальную копию переменных реестра,
используемых приложением. Если указан флаг
"Не подменять каталог WINDOWS каталогом пользователя", то при вызове
функции API GetWindowsDirectory будет использоваться
каталог
%SystemRoot%. Если этот бит не установлен, то по умолчанию
все ссылки на каталог
\Windows заменяются ссылками на каталог
\Windows в каталоге пользователя.
Файлы INI
Prog1.ini, inifile будет Prog1):
| 16-разрядное приложение Windows | 0x4 |
| 32-разрядное приложение Windows | 0x8 |
| Синхронизировать INI-файл пользователя с системной версией | 0x40 |
| Не подменять каталог WINDOWS каталогом пользователя | 0x80 |
Если установлен бит "Синхронизировать INI-файл пользователя с системной версией", он добавляет новые входы в основной системный INI-файл при запуске приложения, но не удаляет существующие данные в файле INI пользователя. Если бит не установлен (по умолчанию), то файл INI пользователя перезаписывается, если он старее системного.
Конфигурация
16-разрядные приложения Windows не используют реестр; вместо него они используют INI-файлы, располагающиеся в каталоге \Windows в Windows 3.x. Для поддержания совместимости со старыми приложениями, WinFrame также использует файлы *.INI для запуска таких приложений. WinFrame ищет файлы *.INI в домашнем каталоге User Environment Profile.
Сетевые приложения Windows 3.x не могут загружать свои драйверы протоколов, поскольку WinFrame имеет собственные. Их можно настроить в Setup или через Network в Control Panel. Если приложение требует указать тип транспорта, всегда выбирайте socket. Это заставит приложения использовать сетевой протокол WinFrame.
Реестр
Brandx\Prog1).
| 32-разрядные приложения Windows | 0x8 |
| Запретить отображение реестра для этого приложения | 0x100 |
Если установлен бит "Запретить отображение реестра для этого приложения", при запуске приложения в основной реестр добавляются новые входы, но данные в реестре пользователя не удаляются. Если бит не установлен (по умолчанию), то данные пользователя перезаписываются и удаляются, если они старее, чем в системном реестре.
Остальные нижеприведенные флаги индивидуальны; они напрямую не зависят друг от друга. Значение каждого из 8 флагов 0х0 означет что-то специальное. При установке значений сразу нескольких флагов их значения надо суммировать.