[ОТВЕТИТЬ]
13.03.2009 06:54
Vovantus
 
Сегодня обнаружил интересную особенность работы СМ в терминальном режиме на 2003 сервере (со всеми системными обновлениями по январь месяц текущего года). Запускаю на серваке диспетчер задач и начинаю мониторить загрузку проца. Захожу на сервак с своего рабочего компа через RDP, запускаю супермаг, начинаю что-нить просматривать. Нагрузка проца процессом SM2000.exe на серваке не превышает 5%. Закрываю RDP, но сессию не завершаю - процесс SM2000 сразу начинает грузить проц на 50%. Снова захожу с магазина на сервак, сессия открыта, продолжаю просмотр доков - нагрузка 50%. Закрываю сессию на серваке, процесс SM2000.exe пропадает, вместе с ним и нагрузка на проц. Снова захожу - нагрузка не более 5%.
Вот такая вот фигня. Связь с магазинами переодически рвётся, следовательно, после потери коннекта нагрузка на проц увеличивается пропорционально количеству сессий. По факту, уже при двух открытых сессиях нагрузка на проц 100%. Пробовал другие программы запускать по похожей схеме - всё ok, проц не грузиться. Жаловаться начали тока сегодня, девушка бухгалтер только вот вышла из декретного отпуска и сразу заметила тормоза. У меня на этом серваке ещё и бухия работает по терминалке. До того как загнал удалённых супермажных пользователей на этот сервак, бухия работала без воплей. У кого какие мысли будут?
13.03.2009 07:02
OlegON
 
Версию на всякий случай? Фильтруешь что-то, когда закрываешь RDP? Или просто стоит?
13.03.2009 07:12
Vovantus
 
Цитата:
OlegON Версию на всякий случай? Фильтруешь что-то, когда закрываешь RDP? Или просто стоит?
Версия 1.024.3.8 При закрытии RDP в СМ тупо классификатор артикулов открыт, ни чего не обрабатывается, не отбирается.
13.03.2009 08:52
Vovantus
 
Разобрался в чём причина. В настройках RDP у клиентов стоит крыжик "последовательные порты". Если его убрать, то описанная мной выше проблема загрузки проца исчезает. Но решив один головняк, получаем другой - перестаёт работать COMовский сканер ШК
13.03.2009 08:54
OlegON
 
На 50%, я понимаю - одно из ядер полностью грузит? Если закрыть все разделы - грузит? Админский модуль грузит? Пока идей нет, пытаюсь нащупать.
13.03.2009 08:56
OlegON
 
Пока размышлял - ты ответил :) А если снять сканер в СМ в настройках - нормально все? Типа порт пропадает?
13.03.2009 09:00
Vovantus
 
Характер загрузки проца таков, что грузятся оба ядра почти равномерно, т.е. где-то по 50%. Это если одна удалённая сессия. Грузится даже тогда, когда СМ просто запущен, без открытых разделов.
13.03.2009 09:04
Vovantus
 
Цитата:
OlegON А если снять сканер в СМ в настройках - нормально все? Типа порт пропадает?
Если в настройках СМ переключить сканер в разрыв клавиатуры, то загруз пропадает. Думается мне, что дело как раз в маппинге COM-порта и/или его кривой реализации через RDP.
З.Ы. Или тупо в СМ это как-то криво реализовано.
16.03.2009 08:10
Vovantus
 
Ребятки. Может кто-нить подтвердить/опровергнуть данный глюк на похожей системе?
17.03.2009 02:48
isi
 
запусти гипертерминал и проверь на нем сканер в вышеописанном режиме, если то же самое то проблема microsoft, если нет, то дорога тебе в С+
А вообще забавный глюк...
17.03.2009 04:44
Vovantus
 
Цитата:
isi запусти гипертерминал и проверь на нем сканер в вышеописанном режиме
Запустил гипер, пикнул ШК, закрыл RDP, нагрузка на проц не повысилась. Проверить данный глюк на более новой версии СМ нет возможности
17.03.2009 08:38
isi
 
Ну если с гипером все гут, то в С+ звони, мож чего подскажут, мы просто не юзаем в таком варианте

И я думаю для работы с компортом С+ используют фрэймворк от мелкософта, посмотри мож есть все таки обновления или более новая версия (3.5 + sp1 вроде не ошибаюсь), третий фрейм включает в себя второй, снеси 2 версию и поставь последнюю третью, может поможет
31.03.2009 07:21
Vovantus
 
Нашёл ещё один головняк в связке 1.024.3.8 + RDP. ТСД у нас Mobile Compia M3. Так как стандартными средствами пробросить USBишный интерфейс для этого ТСД не получилось, пришлось в настройках СМ отключить обмен данными и указать для выгрузки локальный каталог, из которого, впоследствии, данные улетают в магазины (или обратно). Затык в том, что в СМ настройки для всех терминальных пользователей одинаковые. Т.е. путь к файлам выгрузки пишется в подраздел реестра
HKEY_LOCAL_MACHINE, а эта ветка является глобальной для всех. Вполне возможны коллизии при одновременных выгрузках с разных магазинов. Сижу снова ёжика леплю. Есть какие-нить мысли?
31.03.2009 09:32
Vovantus
 
Кстати, а может кто подскажет.. када СМ только отбирает карточки для загрузки в ТСД, он куда данные пишет? В оперативке хранит? Я просто думаю, как это будет выглядеть, если одновременно несколько терминальных пользователей начнут по определённым критериям отбирать карточки для загрузки в ТСД.
31.03.2009 11:16
baggio
 
Цитата:
Vovantus Кстати, а может кто подскажет.. када СМ только отбирает карточки для загрузки в ТСД, он куда данные пишет? В оперативке хранит? Я просто думаю, как это будет выглядеть, если одновременно несколько терминальных пользователей начнут по определённым критериям отбирать карточки для загрузки в ТСД.
да в оперативке...
31.03.2009 12:17
ron
 
Цитата:
Vovantus Нашёл ещё один головняк в связке 1.024.3.8 + RDP. ТСД у нас Mobile Compia M3. Так как стандартными средствами пробросить USBишный интерфейс для этого ТСД не получилось, пришлось в настройках СМ отключить обмен данными и указать для выгрузки локальный каталог, из которого, впоследствии, данные улетают в магазины (или обратно). Затык в том, что в СМ настройки для всех терминальных пользователей одинаковые. Т.е. путь к файлам выгрузки пишется в подраздел реестра
HKEY_LOCAL_MACHINE, а эта ветка является глобальной для всех. Вполне возможны коллизии при одновременных выгрузках с разных магазинов. Сижу снова ёжика леплю. Есть какие-нить мысли?
Есть мысль использовать для обмена папку "Мои документы" или любой другой каталог персональный для каждого пользователя.
31.03.2009 12:34
OlegON
 
Точно! Попробуй эти две переменные вбить
Цитата:
echo %HOMEDRIVE%%HOMEPATH%
01.04.2009 02:13
Vovantus
 
Нет, ребятки, не понимает СМ ни локальных переменных ни системных Тупо, не разварачивает путь из переменной, за что большой минус разработчикам:
-
01.04.2009 08:47
Vovantus
 
Вопрос решил с помощью nnCron. Теперь всё работает как задумано
01.04.2009 09:16
OlegON
 
А поподробнее? Каждый грузит в определенное время?
02.04.2009 02:47
Vovantus
 
Цитата:
OlegON А поподробнее? Каждый грузит в определенное время?
Если особо не вдаваться в подробности, то общая схема выглядит так:

Для выгрузки на ТСД.
Прежде всего, терминальный клиент на сервере запускает ярлычком скрипт, который проверяет наличие флагов выгрузки, созданных другими пользователями. Если флаг обнаружен, то пишется в каком именно магазине выгружают/загружают ТСД. Если чужих флагов нет, создаётся свой. Тем самым, пользователи других магазинов уже не могут зделать выгрузку. Далее, требуется выгрузить данные их СМ в файл. Если пользователь тормозит в течении определённого интервала времени (например, отвлекли), то его флаг автоматически удаляется и, впоследствии, механизм выгрузки требуется запускать снова. После того как выгрузка зделана, скрипт отлавливает этот момент и отправляет уже архивированные данные кусочками в магазин. В завершении происходит удаление соответствующего магазину флага выгрузки.

Для приёма данных с ТСД.
Обратный процесс несколько отличается. Данные из магазина прилетают на сервер (как именно, это отдельная история). Пользователь запускает там ярлычком скрипт, который проверят наличие файла Scanout.dat в папке обмена. Если файл есть, то пользователь курит/пьёт чай. Если файла нет, то происходит извлечение файла из архива и помещение его в папку обмена. Далее, необходимо принять данные в течении определённого интервала времени. Если пользователь тормозит, то файл удаляется, дав тем самым возможность пользователям других магазинов выгрузить ТСД.

На всех этапах схемы обмена происходят всевозможные проверки (архивация, разархивация, отправка, приём, проверка флагов), которые предотвращают различные внештатные ситуации. Но так или иначе, технически от ошибок оператора полностью оградиться не получиться. Так, например, если оператор не запустит скрипт на выгрузку данных на ТСД и тем не менее зделает её из СМ, то вполне возможно что он затрёт чью-то выгрузку, которая была зделана секунду назад. Следовательно, требуется ещё и дрессировать администраторов, чтобы те не нарушали общей схемы.
13.04.2009 16:52
baggio
 
слушайте только что в терминале (было надо с эмулировать ТСД) зафигалил эмулятор.. и выгрузил в него данные...
времени нет разбиратся но может...
Он умеет эмулировать терминал под каждым пользователем в RDP... и собственно проблемы пройдут...


попробывал... не хочет сцук*!... т.е. эмульгатор то с командной строки я запускаю два... а вот ... ActivSync... в разных сесиях не живут.. копаю дальше...
08.06.2009 13:44
Vovantus
 
В продолжении темы. После долгих плясок с бубном, победить глюк не удалось. Возможности обновиться на более свежую версию СМ не имеется, поэтому пошёл огородами. Была придумана программная реализация некоторого смягчения и даже полной ликвидации проблемы. Напомню, что заключалась она в следующем. Если при работе в СМ не терминальном сервере через мелкомягкий RDP разрывается связь, пусть даже на несколько секунд, нагрузка не процессор возрастает до 50 % на одну сессию. При восстановлении связи, нагрузка не снижается. Помогает только перезагрузка СМ. В условиях плохой связи, разрыв/коннект происходят практически незаметно, вследствии чего, нагрузка на процессор возрастает многократно и нередко достигает 100 %. Используя утилиту nnCron, был написан скрипт. Он отслеживает запуск даже нескольких одновременно запущенных процессво СМ разными пользователя и далее начинает мониторить загрузку процессора каждой отдельной сессией. Если зафиксировано, что нагрузка на процессор в течении определённого времени держится на одном уровне, пользователю, который открыл сессию, отправляется сообщение с предложением сохранить данные и перезагрузить СМ. Если в течении минуты пользователь не зделал этого, отправляется следующее сообщение с предупреждение о закрытии его сессии. Через минуту, если пользователь не снял нагрузку на процессор, выполняется отключение его сессии. Если изначально связь разорвалась и в течении определённого времени не было реконекта, то сессия, также, отваливается. Если кто-то наблюдает у себя похожую проблему, то готов поделиться этим решением. Я польностью его отладил и протестировал, всё отлично работает.
15.03.2010 09:22
atta.root
 
Vovantus, поделитесь с сообществом скриптиком если не сложно. Столкнулся с теми же проблемами.
15.03.2010 09:43
Vovantus
 
Придётся конфигурировать скрипт "под себя". Позже дам подробное описание, а пока мой вариант выглядит вот так:

Цитата:
#( sm_test_cpu

WatchProc: "sm2000.exe"

USER rdp_ran
USER rdp_pid
USER-CREATE rdp_user 16 USER-ALLOT
USER-CREATE rdp_id 16 USER-ALLOT
USER-CREATE rdp_name 16 USER-ALLOT
USER-CREATE rdp_ip 16 USER-ALLOT

Action:

100 RANDOM 100 RANDOM + rdp_ran !
WATCH-PROC-ID rdp_pid !

SWHide
START-APPW: "tasklist.exe /FI %QUOTE%PID eq %rdp_pid @%%QUOTE% > %temp%\rdp_pid_%rdp_ran @%.txt"
START-APPW: "for /F "skip=3 tokens=3" %%i in ( %temp%\rdp_pid_%rdp_ran @%.txt) DO echo %%i > %temp%\rdp_name_%rdp_ran @%.txt"
START-APPW: "for /F "skip=3 tokens=4" %%i in ( %temp%\rdp_pid_%rdp_ran @%.txt) DO echo %%i > %temp%\rdp_id_%rdp_ran @%.txt"
S" %temp%\rdp_id_%rdp_ran @%.txt" EVAL-SUBST FILE 3 - 0 MAX rdp_id PLACE
S" %temp%\rdp_name_%rdp_ran @%.txt" EVAL-SUBST FILE 3 - 0 MAX
START-APPW: "cmd.exe /c query.exe session %1 esPICKS% > %temp%\rdp_session_%rdp_ran @%.txt
START-APPW: "for /F "skip=1 tokens=2" %%i in ( %temp%\rdp_session_%rdp_ran @%.txt) DO echo %%i > %temp%\rdp_user_%rdp_ran @%.txt"
S" %temp%\rdp_user_%rdp_ran @%.txt" EVAL-SUBST FILE 3 - 0 MAX rdp_user PLACE
FILE-DELETE: "%temp%\*%rdp_ran @%.txt"

BEGIN

PROC-EXIST: "%rdp_pid @%" NOT
IF
EXIT
THEN

rdp_pid @ N>S 20000 (PROC-CPU-USAGE) 20 >
IF

S" MX01" S" %rdp_user COUNT%" EVAL-SUBST COMPARE 0 =
IF
S" SVGSHOP" rdp_name PLACE
S" 192.168.1.10" rdp_ip PLACE
THEN

S" MX02" S" %rdp_user COUNT%" EVAL-SUBST COMPARE 0 =
IF
S" HIMSHOP" rdp_name PLACE
S" 192.168.2.11" rdp_ip PLACE
THEN

S" MX03" S" %rdp_user COUNT%" EVAL-SUBST COMPARE 0 =
IF
S" KANCSHOP" rdp_name PLACE
S" 192.168.2.10" rdp_ip PLACE
THEN

FILE-APPEND: "d:\logs\SmCPU\%rdp_user COUNT%\%MM%-%DD%.txt" "%crlf%%hh%:%mm%:%ss% Start%crlf%"

PROC-EXIST: "%rdp_pid @%" NOT
IF
FILE-APPEND: "d:\logs\SmCPU\%rdp_user COUNT%\%MM%-%DD%.txt" "%hh%:%mm%:%ss% Stop%crlf%"
EXIT
THEN

BEGIN
NHOST-EXIST: "%rdp_ip COUNT%" 2
IF
PROC-EXIST: "%rdp_pid @%" NOT
IF
FILE-APPEND: "d:\logs\SmCPU\%rdp_user COUNT%\%MM%-%DD%.txt" "%hh%:%mm%:%ss% Stop%crlf%"
EXIT
THEN
S" net.exe send %rdp_name COUNT% " EVAL-SUBST
S" ВНИМАНИЕ! ЗАФИКСИРОВАН РАЗРЫВ СВЯЗИ С СМ2000! ПЕРЕЗАГРУЗИТЕ/ЗАКРОЙТЕ ПРОГРАММУ!" S+
START-APPW
ExitCodeProc 0 = NOT
IF
PROC-EXIST: "%rdp_pid @%" NOT
IF
FILE-APPEND: "d:\logs\SmCPU\%rdp_user COUNT%\%MM%-%DD%.txt" "%hh%:%mm%:%ss% Stop%crlf%"
EXIT
THEN
BEGIN
BEGIN
1000 PAUSE
START-APPW: psservice.exe \\%rdp_ip COUNT% stop messenger
ExitCodeProc 0 =
UNTIL

BEGIN
1000 PAUSE
START-APPW: cmd.exe /c sc.exe \\%rdp_ip COUNT% query "messenger" | FIND "STOPPED"
ExitCodeProc 0 =
UNTIL

BEGIN
1000 PAUSE
START-APPW: psservice.exe \\%rdp_ip COUNT% start messenger
ExitCodeProc 0 =
UNTIL

BEGIN
1000 PAUSE
START-APPW: cmd.exe /c sc.exe \\%rdp_ip COUNT% query "messenger" | FIND "RUNNING"
ExitCodeProc 0 =
UNTIL

S" net.exe send %rdp_name COUNT% "
S" ВНИМАНИЕ! ЗАФИКСИРОВАН РАЗРЫВ СВЯЗИ С СМ2000! ПЕРЕЗАГРУЗИТЕ/ЗАКРОЙТЕ ПРОГРАММУ!" S+
START-APPW
ExitCodeProc 0 =
UNTIL
THEN
-1
ELSE
0
THEN
UNTIL

60000 PAUSE

PROC-EXIST: "%rdp_pid @%" NOT
IF
FILE-APPEND: "d:\logs\SmCPU\%rdp_user COUNT%\%MM%-%DD%.txt" "%hh%:%mm%:%ss% Stop%crlf%"
EXIT
THEN
BEGIN
NHOST-EXIST: "%rdp_ip COUNT%" 2
IF
PROC-EXIST: "%rdp_pid @%" NOT
IF
FILE-APPEND: "d:\logs\SmCPU\%rdp_user COUNT%\%MM%-%DD%.txt" "%hh%:%mm%:%ss% Stop%crlf%"
EXIT
THEN
S" net.exe send %rdp_name COUNT% "
S" СЕРВЕР ПЕРЕГРУЖЕН! ВАША СЕССИЯ БУДЕТ УДАЛЕНА ЧЕРЕЗ 1 МИНУТУ! СОХРАНИТЕ ДАННЫЕ В СМ2000!" S+
START-APPW
ExitCodeProc 0 = NOT
IF
PROC-EXIST: "%rdp_pid @%" NOT
IF
FILE-APPEND: "d:\logs\SmCPU\%rdp_user COUNT%\%MM%-%DD%.txt" "%hh%:%mm%:%ss% Stop%crlf%"
EXIT
THEN

BEGIN
BEGIN
1000 PAUSE
START-APPW: psservice.exe \\%rdp_ip COUNT% stop messenger
ExitCodeProc 0 =
UNTIL

BEGIN
1000 PAUSE
START-APPW: cmd.exe /c sc.exe \\%rdp_ip COUNT% query "messenger" | FIND "STOPPED"
ExitCodeProc 0 =
UNTIL

BEGIN
1000 PAUSE
START-APPW: psservice.exe \\%rdp_ip COUNT% start messenger
ExitCodeProc 0 =
UNTIL

BEGIN
1000 PAUSE
START-APPW: cmd.exe /c sc.exe \\%rdp_ip COUNT% query "messenger" | FIND "RUNNING"
ExitCodeProc 0 =
UNTIL

S" net.exe send %rdp_name COUNT% " EVAL-SUBST
S" СЕРВЕР ПЕРЕГРУЖЕН! ВАША СЕССИЯ БУДЕТ УДАЛЕНА ЧЕРЕЗ 1 МИНУТУ! СОХРАНИТЕ ДАННЫЕ В СМ2000!" S+
START-APPW
ExitCodeProc 0 =
UNTIL
THEN
-1
ELSE
0
THEN
UNTIL

60000 PAUSE

PROC-EXIST: "%rdp_pid @%" NOT
IF
FILE-APPEND: "d:\logs\SmCPU\%rdp_user COUNT%\%MM%-%DD%.txt" "%hh%:%mm%:%ss% Stop%crlf%"
EXIT
THEN
S" reset session %rdp_id COUNT%" EVAL-SUBST START-APPW
FILE-APPEND: "d:\logs\SmCPU\%rdp_user COUNT%\%MM%-%DD%.txt" "%hh%:%mm%:%ss% Kill%crlf%"

BEGIN
NHOST-EXIST: "%rdp_ip COUNT%" 2
IF
S" net.exe send %rdp_name COUNT% "
S" ВАША СЕССИЯ БЫЛА УДАЛЕНА С СЕРВЕРА В ЦЕЛЯХ СНИЖЕНИЯ НАГРУЗКИ!" S+
START-APPW
ExitCodeProc 0 = NOT
IF
BEGIN
BEGIN
1000 PAUSE
START-APPW: psservice.exe \\%rdp_ip COUNT% stop messenger
ExitCodeProc 0 =
UNTIL

BEGIN
1000 PAUSE
START-APPW: cmd.exe /c sc.exe \\%rdp_ip COUNT% query "messenger" | FIND "STOPPED"
ExitCodeProc 0 =
UNTIL

BEGIN
1000 PAUSE
START-APPW: psservice.exe \\%rdp_ip COUNT% start messenger
ExitCodeProc 0 =
UNTIL

BEGIN
1000 PAUSE
START-APPW: cmd.exe /c sc.exe \\%rdp_ip COUNT% query "messenger" | FIND "RUNNING"
ExitCodeProc 0 =
UNTIL

S" net.exe send %rdp_name COUNT% "
S" ВАША СЕССИЯ БЫЛА УДАЛЕНА С СЕРВЕРА В ЦЕЛЯХ СНИЖЕНИЯ НАГРУЗКИ!" S+
START-APPW
ExitCodeProc 0 =
UNTIL
THEN
-1
ELSE
0
THEN
UNTIL
THEN
AGAIN

)#
нужны будут некоторые утилиты из пакета Sysinternals, ну и серверная ОС. для XP придётся скрипт передылевыть.
16.03.2010 07:27
Vovantus
 
скрипт я писал давно, уже и забыл, что там к чему короче, давайте вместе (кому интересно), по частям править код к более приемлемому для всех варианту. работать будет только под 2003 сервером. предлагаю начать с простого, берём вот этот код:
Цитата:
#( sm_test_cpu

WatchProc: "sm2000.exe"

\ определяем ряд переменных, необходимых в работе
USER rdp_ran
USER rdp_pid
USER-CREATE rdp_user 16 USER-ALLOT
USER-CREATE rdp_id 16 USER-ALLOT
USER-CREATE rdp_ip 16 USER-ALLOT

Action:

\ генерируем случайное число
100 RANDOM 100 RANDOM + rdp_ran !
WATCH-PROC-ID rdp_pid !

\ выковыриваем нужные данные из терминальной сессии юзера, запустившиго супермаг
SWHide
START-APPW: "tasklist.exe /FI %QUOTE%PID eq %rdp_pid @%%QUOTE% > %temp%\rdp_pid_%rdp_ran @%.txt"
START-APPW: "for /F "skip=3 tokens=3" %%i in ( %temp%\rdp_pid_%rdp_ran @%.txt) DO echo %%i > %temp%\rdp_name_%rdp_ran @%.txt"
START-APPW: "for /F "skip=3 tokens=4" %%i in ( %temp%\rdp_pid_%rdp_ran @%.txt) DO echo %%i > %temp%\rdp_id_%rdp_ran @%.txt"
S" %temp%\rdp_id_%rdp_ran @%.txt" EVAL-SUBST FILE 3 - 0 MAX rdp_id PLACE
S" %temp%\rdp_name_%rdp_ran @%.txt" EVAL-SUBST FILE 3 - 0 MAX
START-APPW: "cmd.exe /c query.exe session %1 esPICKS% > %temp%\rdp_session_%rdp_ran @%.txt
START-APPW: "for /F "skip=1 tokens=2" %%i in ( %temp%\rdp_session_%rdp_ran @%.txt) DO echo %%i > %temp%\rdp_user_%rdp_ran @%.txt"
S" %temp%\rdp_user_%rdp_ran @%.txt" EVAL-SUBST FILE 3 - 0 MAX rdp_user PLACE
FILE-DELETE: "%temp%\*%rdp_ran @%.txt"

\ выводим в сообщении имя пользователя
S" имя пользователя, запустившего супермаг : " rdp_user COUNT S+ MsgBox

)#
и запихиваем в кронтаб. далее, перезапускаем nnCron, заходим терминально на сервак и запускаем супермаг. теоритически, должно выскочить сообщение с именем пользователя.

З.Ы. задача предназначена для серверного кронтаба!
19.10.2010 14:25
Vovantus
 
после обновления супермага до актуальной версии, проблема не исчезла :( всё также после разрыва терминальной сессии возрастает нагрузка на серверный процессор до 100%. кто работает через терминальный доступ, у вас такой фигни не набюлюдается?
Опции темы


Часовой пояс GMT +3, время: 17:08.

 

Форум сделан на основе vBulletin®
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd. Перевод: zCarot и OlegON
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.