Как я могу уменьшить высокую загрузку ЦП от ЦОД с последовательными портами USB

1757
rossmcm

У меня есть приложение, которое связывается с 50 устройствами через последовательные порты. Обмен данными происходит в потоках, а потоки регулируются, так что только определенное число активно одновременно. Потоки создаются по мере необходимости, выполняют свою работу, завершают и освобождают свои используемые ресурсы.

В некоторых случаях последовательные порты реализованы с портами Ethernet Moxa TCP / IP. Драйвер Moxa работает на ПК, который представляет устройства Moxa в сети как COM-порт.

В других случаях последовательные порты реализуются через концентраторы USB, которые предоставляют по 10 последовательных портов каждый.

Здесь проблема. Когда используются только последовательные порты Moxa и (скажем) 8, загрузка ЦП приложения колеблется от 1% до 30%, в зависимости от того, сколько потоков активно. Приложение ведет себя разумно, а ПК отзывчив.

Если затем включить 8 портов USB, загрузка ЦП приложения достигает пика в 50-60%, как я и ожидал, но общее использование ЦП компьютера увеличивается почти до 100% и остается там. Не удивительно, что все останавливается.

Я использовал Process Explorer и обнаружил, что основная часть использования ЦП вне моего приложения была связана с двумя задачами - System Idle Process / DPC (отложенные вызовы процедур) и System Idle Process / System. Использование в этих задачах достигает 40% каждый. Когда используются только порты Moxa, эти задачи не показывают значительной загрузки ЦП.

Я попытался возиться с приоритетом потока, и это не имеет значения. Порты работают с относительно низкой скоростью передачи данных (2400).

При запуске средства проверки задержки DPC отображается задержка до 6 мс, когда используются последовательные порты USB.

1
К сожалению, если не считать переписывания драйверов для рассматриваемых интерфейсов портов или просто уменьшения нагрузки, я не думаю, что вы многое можете сделать. Может быть, у кого-то более знающего будет какая-то черная магия. Shinrai 12 лет назад 4
Смотрите это ... http: //www.msfn.org/board/topic/140263-how-to-get-the-cause-of-high-cpu-usage-by-dpc-interrupt/ Moab 12 лет назад 0
Благодарю. Очень тщательная публикация. LatencyMon нужна Win7. Я не могу установить XPERF.exe в системе Win 7 (очевидно, я могу скопировать EXE в систему XP и использовать его). Я установил комплект производительности Windows на свою систему Win7, но XPerf нигде не видно. rossmcm 12 лет назад 0

1 ответ на вопрос

1
rossmcm

Высокая загрузка ЦП объясняется тем, что в приложении каждый канал открыл свой последовательный порт в начале сеанса и оставил его открытым в течение всего сеанса приложения. Это было хорошо с портами, основанными на адаптерах Ethernet-COM-портов Moxa, или с «локальными» портами, но в портах USB, просто открытый порт вызывает использование ЦП DPC. Наличие 16 открытых портов USB делает компьютер непригодным для использования, несмотря на отсутствие трафика на любом порту.

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

Ну, это подпадает под мой сценарий «уменьшить нагрузку». Красиво сделано. Shinrai 12 лет назад 0

Похожие вопросы