CTX846521: Тонкая настройка приложений


Информация в этой статье применяется к:


Этот документ содержит информацию, относящуюся к 16-битным, 32-битным и DOS-приложениям.

Приложения 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

  1. Запустите DOSKBD со значениями по умолчанию чтобы увидеть, какой эффект они оказывают, а затем приступите к следующим шагам.
  2. Во второй попытке попробуйте следующие значения:
    /DetectProbationCount:1
    /InProbationCount:1
    /msSleep:10,000
    /BusymsAllowed:1
    
  3. В третьей попытке измените направление значений, использованных на 2-м этапе:
    /DetectProbationCount:10,000
    /InProbationCount:10,000
    /msSleep:1
    /BusymsAllowed:10,000
    
Суть этой идеи состоит в определении направления, в котором следует менять эти значения (вверх или вниз) с целью уменьшения использования CPU. Например, если приложение использует CPU меньше на этапе 2, вы знаете, что значения по умолчанию для этих параметров следует уменьшить или увеличить. Этот процесс займет некоторое время.

амечания

Вы можете использовать редактор 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? Они пробовали следующее?

Поноэкранные приложения DOS не открываются в сеансе ICA. Они не поддерживаются в сеансах Windows 2000. Это также справдливо для соединений RDP.

Некоторые приложения, нормально работающие в Windows NT 4.0 TSE, при работе в Windows 2000 TS потребляют 100% CPU. Microsoft удалила определение "плохих приложений" из Windows 2000. Ищите на Microsoft hotixes на предмет специфичных приложений в Windows 2000.

Из справки по Windows 2000:

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

Microsoft специально не тестировала и не поддерживает DOS-приложения в Terminal Server и рекомендует заменять их 32-разрядными Windows-аналогами.

Повышение производительности программ Clipper

Одна программа на 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 для изменения ее исполняемого кода.

  1. Загрузите утилиту Clip2F.exe по адресу: ftp://ftp.citrix.com/Utilities/Clip2F.exe
  2. Отредактируйте файл Clip2f.pat, указав в нем имя исполняемого файла Clipper-программы. Измените строку 14 файла Clip2f.pat:
    load Program.exe
    
    , где Program.exe имя исполняемого файла Clipper-программы.
  3. Сохраните Clip2f.pat и запустите следующую команду:
    PATCHA CLIP2F
    
    Эта команда патчит программу, вставляя вызов "Release CPU".

FoxPro и WinFrame 1.x

Инсталляция

  1. Перед установкой FoxPro введите с командной строки change user /install
  2. Установите FoxPro for Windows
  3. По завершении установки введите в командной строке change user /execute.

Использование

FoxPro for Windows работает не как обычное приложение Windows, поскольку не использует стандартные средства Windows для отображения окон, кнопок и пр. Он работает скорее как DOS-приложение. Окно в нем фомируется как картинка в видеобуфере. При любом изменении в картинке она целиком выводится на экран. Это вызывает медленную прорисовку некоторых диалоговых окон. Для решения этой проблемы есть утилита Foxpfix.exe

  1. Запустите Foxpfix.exe с опцией /Q для запроса состояния исполняемого файла. Для оценки влияния на производительность, попробуйте сначала режим "enabled", а потом - "disabled".
  2. Проверьте производительность FoxPro for Windows на консоли и на клиенте.
  3. Если производительность падает на клиенте, скорее всего это связано с обновлением экрана. Вот рекомендации по проектированию интерфейса Foxpro:
  4. Если проблема с производительностью наблюдается с консоли, используйте Performance Monitor для проверки испольования CPU. Если процент использования CPU высокий, попробуйте отменить изменения, сделанные утилитой Foxpfix, выполнив foxpfix /disable.

Проблемы с 16-битными приложениями

16-разрядная подситема не изменилась при переходе от WinFrame к MetaFrame, поэтому все рассуждения и решения остаются. Например, если два 16-разрядных приложения работают в одном сеансе, и одно из них зависает, второе тоже зависнет. Этого можно избежать, включив опцию Run In Separate Memory Space. Если два приложения работают в разных сеансах, 16-разрядные приложения не влияют друг на друга.

Настройка 16- и 32-разрядных приложений

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

Очередь клаиатуры и мыши на клиенте ICA

Citrix ICA Client помещает данные клаватуры и мыши в очередь для уменьшения количества передаваемых пакетов. Это полезно на медленных линиях, но в локальной сети выключение буферизации событий клавиатуры и мыши ускоряет реагирование приложений.

Выключение очереди клавиатуры и мыши увеличивает число посылаемых пакетов. Это нежелательно в WAN.

Вы можете переключать очереди индивидуально для каждого соединения в Remote Application Manager.

  1. Запустите Citrix ICA Client Remote Application Manager.
  2. Подсветите нужное соединение
  3. В меню Entry выберите Properties.
  4. На закладке Connection Options снимите флажки с Queue mouse movements и Queue keystrokes.
  5. Щелкните OK

Биты совместимости

Меняйте биты совместимости только в том случае, если приложение неправильно работает. Разные биты отвечают за приложение, регистр, 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) реестра.

Ключи совместимости, Приложения

где appname - имя исполняемого файла приложения (например, для файла 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-разрядных приложений одновременно.

Приложение DOS0x1
Приложение OS/2 0x2
16-разрядное приложение Windows 0x4
32-разрядное приложение Windows 0x8
Возвращать имя пользователя вместо имени компьютера 0x10
Вернуть номер сбоки Citrix 0x20
Запретить для этого приложения отображение реестра 0x100
Не подменять каталог WINDOWS каталогом пользователя 0x400

Используйте "Возвращать имя пользователя вместо имени компьютера" для тех приложений, которые используют в качестве уникального идентификатора имя компьютера. В этом случае программе будет передаваться имя пользователя, давая приложению уникальный идентификатор. Используйте "Запретить для этого приложения отображение реестра", чтобы приложение поддерживало только одну глобальную копию переменных реестра, используемых приложением. Если указан флаг "Не подменять каталог WINDOWS каталогом пользователя", то при вызове функции API GetWindowsDirectory будет использоваться каталог %SystemRoot%. Если этот бит не установлен, то по умолчанию все ссылки на каталог \Windows заменяются ссылками на каталог \Windows в каталоге пользователя.

Файлы INI

где inifile является именем файла 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.

Реестр

где pathname это ветвь реестра под ключом \\HKEY_CURRENT_USER\SOFTWARE (например, если есть ветвь \\HKEY_CURRENT_USER\SOFTWARE\BrandX\Prog1, то pathname будет Brandx\Prog1).

32-разрядные приложения Windows 0x8
Запретить отображение реестра для этого приложения0x100

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

Остальные нижеприведенные флаги индивидуальны; они напрямую не зависят друг от друга. Значение каждого из 8 флагов 0х0 означет что-то специальное. При установке значений сразу нескольких флагов их значения надо суммировать.