Кто-либо получил какие-либо показатели производительности, сравнивающие IIS и.NET к чероки и Моно?

Сводка: Вы корректны, что получение сигнала не прозрачно, ни один в случае, если я (прерванный не считав что-либо), ни в случае, если ii (прервал после частичного чтения). Сделать иначе в случае, если я потребовал бы коренных изменений внесения и к архитектуре операционной системы и к архитектуре приложений.

Представление реализации ОС

Рассмотрите то, что происходит, если системный вызов прерван сигналом. Обработчик сигналов выполнит код непривилегированного режима. Но syscall обработчик является кодом ядра и не доверяет никакому коду непривилегированного режима. Поэтому давайте исследуем выбор для syscall обработчика:

  • Завершите системный вызов; отчет, сколько было сделано к пользовательскому коду. Это до кода приложения для перезапуска системного вызова в некотором роде при желании. Это - то, как Unix работает.
  • Сохраните состояние системного вызова и позвольте пользовательскому коду возобновлять вызов. Это проблематично по нескольким причинам:
    • В то время как пользовательский код работает, что-то, могло оказаться, делало недействительным сохраненное состояние. Например, при чтении из файла, файл мог бы быть усеченным. Таким образом, для кода ядра была бы нужна большая логика для обработки этих случаев.
    • Сохраненному состоянию нельзя позволить сохранить блокировку, потому что нет никакой гарантии, что пользовательский код будет когда-либо возобновлять syscall, и затем блокировка была бы сохранена навсегда.
    • Ядро должно выставить новые интерфейсы, чтобы возобновить или отменить продолжающийся syscalls, в дополнение к нормальному интерфейсу для запуска syscall. Это - большая сложность для редкого случая.
    • Сохраненное состояние должно было бы использовать ресурсы (память, по крайней мере); те ресурсы должны были бы быть выделены и сохранены ядром, но рассчитать против выделения процесса. Это не непреодолимо, но это - сложность.
      • Обратите внимание, что обработчик сигналов мог бы сделать системные вызовы, которые сами прерваны; таким образом, у Вас не может только быть статического выделения ресурса, которое покрывает весь возможный syscalls.
      • И что, если ресурсы не могут быть выделены? Затем syscall должен был бы перестать работать так или иначе. Что означает, что приложение должно было бы иметь код для обработки этого случая, таким образом, этот дизайн не упростит код приложения.
  • Останьтесь происходящими (но приостановленный), создайте новый поток для обработчика сигналов. Это, снова, проблематично:
    • Ранние реализации Unix имели единственный поток для каждого процесса.
    • Обработчик сигналов рискнул бы переступать на обуви syscall. Это - проблема так или иначе, но в текущем дизайне Unix, она содержится.
    • Ресурсы должны были бы быть выделены для нового потока; посмотрите выше.

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

Представление проектирования приложений

Когда приложение прервано посреди системного вызова, syscall должен продолжиться к завершению? Не всегда. Например, рассмотрите программу как оболочка, это читает строку из терминала и пользовательские нажатия Ctrl+C, инициирование SIGINT. Чтение не должно завершаться, это - то, о чем сигнал - все. Обратите внимание, что этот пример показывает что read syscall должен быть прерываемым, даже если никакой байт еще не был считан.

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

read системный вызов является способом, которым это - потому что это - примитив, который имеет смысл, учитывая общий дизайн операционной системы. То, что это означает, примерно, “читайте так, как Вы можете, до предела (размер буфера), но останавливаться, если что-то еще происходит”. На самом деле считать полный буфер включает выполнение read в цикле, пока не было считано как можно больше байтов; это - высокоуровневая функция, fread(3). В отличие от этого, read(2) который является системным вызовом, fread библиотечная функция, реализованная в пространстве пользователя сверху read. Это подходит для приложения, которое читает для файла или умирает, пробуя; это не подходит для интерпретатора командной строки или для сетевой программы, которая должна отрегулировать соединения чисто, ни для сетевой программы, которая имеет параллельные соединения и не использует потоки.

Пример чтения в цикле обеспечивается в Системном Программировании Linux Robert Love:

ssize_t ret;
while (len != 0 && (ret = read (fd, buf, len)) != 0) {
  if (ret == -1) {
    if (errno == EINTR)
      continue;
    perror ("read");
    break;
  }
  len -= ret;
  buf += ret;
}

Это заботится о case i и case ii и еще много.

8
11.08.2010, 16:00
2 ответа

При тестировании Моно / Linux по сравнению с рабочими нагрузками.NET/Windows, необходимо помнить, что там более приведено в действие, чем просто среда выполнения.

Существуют области, в которых Linux работает лучше, чем Windows (Большая часть IO, и сетевые операции имеют тенденцию быть быстрее для сопоставимых программ C). В то же время.NET имеет более усовершенствованный сборщик "мусора" и более усовершенствованный JIT-компилятор.

Когда дело доходит до библиотек классов это действительно зависит, на каких путях выполнения кода Вы используете. Как JacksonH заявил относительно предыдущего сообщения, можно поразить пути выполнения кода, которые были оптимизированы в одной реализации, но не на другом, и наоборот.

На рабочих нагрузках ASP.NET необходимо помнить, что установка по умолчанию направит все входящие запросы к единственному процессу "рабочего", mod_mono, и чероки используют аналогичный подход:

Many HTTP server to one mod-mono-server
(источник: mono-project.com)

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

Routing requests to different ASP.NET hosts with mod_mono
(источник: mono-project.com)
Детали о том, как настроить эту установку, доступны здесь:

http://mono-project.com/Mod_mono

7
27.01.2020, 20:11

Это - своего рода неответ. Однако здесь нет реального ответа. К сожалению, эта вещь является очень зависящей от приложения. Ваше приложение могло совершить нападки на чем-то, что Моно, оказывается, действительно успевает, или Вы могли бы в большой степени использовать что-то, что реализовано плохо или имеет некоторые ошибки. Это не действительно случай Моно, являющихся в X разы более медленным/быстрее, чем IIS.

Мое предложение состоит в том, чтобы взять Ваше приложение, развернуть его на двух различных экземплярах EC2 (один Windows и один Моно) и сделать Ваше тестирование там. При нахождении главных проблем о Моно экземпляре сообщите о них, и мы попытаемся улучшить вещи.

Все, что быть сказанным, я могу сказать Вам от личного опыта, что Моно aspx действительно работает действительно хорошо.

7
27.01.2020, 20:11
  • 1
    Seconding - Я использую Apache + mod_mono, и он работает очень хорошо, после того как он начинает. Единственное время я вижу замедление, во время начальной загрузки страницы, но это распространено с в значительной степени всем (Направляющие, и т.д.). работы X-мозаики –  B.R. 11.08.2010, 19:44

Теги

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