2010-12-15 2 views
2

У нас есть серверное приложение базы данных, которое состоит из следующих компонентов: 1) Приложение-служба с базой данных, принимающей вызовы веб-службы 2) Рабочее приложение (exe), которое делает запрос веб-службы в приложение-службу для получения некоторой работы. Затем он выполняет некоторую работу и обновляет базу данных напрямую, а затем вызывает другой запрос веб-службы, чтобы сообщить сервисному приложению, что работа завершена.Как заставить серверное приложение использовать отдельные ядра

Мы запускаем ряд рабочих приложений (другими словами, запускаем исполняемый файл несколько раз, поэтому существует несколько экземпляров его запуска), поэтому каждый может запрашивать работу из приложения-службы и продолжать работу без вмешательства других рабочих приложений ,

Если я переведу это приложение на машину с несколькими ядрами, есть ли способ разделения рабочих приложений на разные ядра и в то же время иметь приложение-приложение на другом ядре?

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

В прошлых тестах я вижу, что все рабочие приложения запущены, и приложение-служба работает на одном и том же ядре, что максимизирует его, в то время как у меня есть 3 ядра, ничего не делая.

Любые идеи?

JD.

ответ

4

Не рекомендуется вручную принудительно запускать каждое приложение по определенному ядру. Существует несколько проблем.

Что делать, если вы перешли на другую машину с двумя ядрами (изменение кода - не очень хорошая идея).

Вы создадите узкие места для своего приложения, потому что для операционной системы существуют другие системные задачи, а также другие приложения на одном компьютере, и ваше приложение на ядре 3 ожидает фрагмент времени, в то время как ядро ​​2 является бесплатным, но вы сказали OS, чтобы запустить его по ядру 3. У вас нет контроля над внешними факторами. Помните, что OS будет использовать сложные алгоритмы для планирования задач и его трудно сделать лучше, чем OS.

Что я предлагаю использовать в вашей заявке Task Library из .NET 4.0. Он решит, как эффективно использовать несколько ядер вашей машины.

+0

Привет, Томас, я должен был дать дополнительную информацию. Это приложение с победой 32, написанное несколько лет назад. Поэтому заставить приложение использовать разные ядра - это НЕ хорошая идея, как вы сказали. Будет ли ОС использовать разные ядра для выполнения одного и того же исполняемого файла несколько раз? Хотя я изначально сказал, что исполняемые файлы запускаются на одном ядре, я не помню ничего в коде, заставляющем приложение использовать конкретное ядро. –

+0

@JD: По умолчанию ОС распределяет вычислительную мощность поровну между приложениями (с тем же приоритетом, конечно), за исключением того, что мы явно определяем. Вы не должны беспокоиться об этом, ОС управляет ресурсами для вас в вашем случае, но «Библиотека задач» - это многопоточная библиотека, предназначенная для использования мощностей многоядерных процессоров. –

2

Если честно, если вы планируете переписывать его для поддержки нескольких ядер, используйте для этого многопоточность в .NET4, это будет лучшая абстракция вашего приложения, а не один экземпляр приложения для каждой задачи, есть одно приложение, выполняющее все задачи с использованием асинхронной потоковой передачи, которая будет автоматически обрабатываться через несколько ядер. Просто мой/2c.

3

В прошлых тестах, я вижу, все рабочие приложения бегущего и приложение-служба работает на том же ядре, который Maxing его в то время как у меня есть 3 ядра не делает ничего.

Это случайная проблема в вашем программировании. Рабочие - отдельные процессы = отдельные потоки, поэтому они распределяются по определению.

Если вы ahve 4 из них, и 1 делают всю работу и 3 в режиме ожидания, это может быть, что:

  • Ваших рабочие блокируют, поэтому пока один работает на Пример ДБ блокирует другие , поэтому они обрабатывают запрос, но работают для завершения. Для exmaple из-за блокировки базы данных.
  • Распределение вашей работы ошибочно, так как сервер отправляет все запросы одному работнику, а не распределяет его. В этом случае дополнительные работники - это в основном избыточный багаж, который вы носите.

Оба не являются проблемами ОС. Обычно ОС распределяет потоки для лечения, а несколько процессов - это несколько потоков, поэтому они распределяются по умолчанию.

Возможно, что-то, что может быть неправильным, заключается в том, что ваше сервисное приложение НЕ многопоточное, поэтому, хотя оно может распространять нагрузку на рабочих, оно обрабатывает только один запрос (это может быть проблема настройки конфигурации/веб-службы). Это, естественно, означает, что только один процесс всегда обрабатывается оттуда. Видел, что это происходит.

Смежные вопросы