Puma на самом деле многопоточный и многопроцессорный. Вы можете вызвать его в «кластерном режиме», где он будет выведен из нескольких разветвленных работников, которые будут работать на разных ядрах на МРТ. Поскольку Puma многопоточен, вероятно, он подходит для запуска нескольких процессов, равных количеству ядер на сервере. Таким образом, для 4 ядра сервера то, как это было бы целесообразно:
puma -t 8:32 -w 4 --preload
Это будет обслуживать до 32 одновременных потоков, до 4 потоков, выполняющихся на процессорах одновременно и должны иметь возможность максимально использовать ресурсы процессора на сервер. Аргумент --preload
предварительно загружает приложение и использует преимущества рубинового 2.0 COW для сборки мусора для уменьшения использования ОЗУ.
Если ваше приложение тратит значительное время на другие сервисы (службы поиска, базы данных и т. Д.), То это будет большим улучшением. Когда поток блокируется, другой поток в том же процессе может захватить процессор и работать. В этом примере вы можете поддерживать до 32 запросов параллельно, в то время как только для запуска 4 процессов в ОЗУ.
С помощью Единорога вам придется раскошелиться на 32 рабочих, которые будут хитом запускать 32 процесса в ОЗУ, что очень расточительно.
Если все ваше приложение выполняет хруст центрального процессора, это будет крайне неэффективно, и вы должны уменьшить количество единорогов, а преимущества Puma над Unicorn будут уменьшены. Но в случае с Unicorn вам нужно сравнить ваше приложение и выяснить правильный номер. Puma будет стремиться оптимизировать себя, создавая больше потоков, и ее производительность должна варьироваться от не хуже Unicorn (в чистом случае процессора) до уровня, который намного лучше, чем Unicorn (в случае приложения, которое много спит).
Конечно, если вы используете Rubinius или JRuby, тогда это не соревнование, и вы можете создать один процесс, который работает многоядерным и обрабатывает все 32 потока.
TL; DR, что я не думаю, что у Единорога есть много преимуществ по сравнению с Puma, поскольку Puma фактически использует обе модели.
Конечно, я ничего не знаю о надежности Puma против Unicorn в запуске программного обеспечения для производства в реальном мире. Одна вещь, о которой стоит беспокоиться, это то, что если вы начертаете какое-либо глобальное состояние в одном потоке, это может повлиять на выполнение других запросов одновременно, что может привести к неопределенным результатам. Поскольку Unicorn не использует потоки, проблем с параллелизмом нет. Я хотел бы надеяться, что к этому времени оба Puma и Rails являются зрелыми в отношении проблем параллелизма и что Puma можно использовать в производстве. Тем не менее, я не обязательно буду ожидать, что каждый плагин rails и rubygem, который я нашел в GitHub, будут потокобезопасными и ожидаем, что вам придется выполнять дополнительную работу. Но как только вы достаточно успешны, чтобы находить проблемы с потоками в сторонних библиотеках, вы, вероятно, достаточно велики, чтобы не позволить себе расходы на ОЗУ для запуска большого количества процессов Unicorn. OTOH, я понимаю ошибки параллелизма, и я хорошо разбираюсь в Ruby, так что стоимость отладки может быть намного меньше для меня, чем стоимость покупки ОЗУ в облаке. YMMV.
Также обратите внимание, что я не уверен, следует ли считать количество гипертекстовых ядер или физических ядер при оценке значения для перехода на «-w», и вам нужно будет перенести тест самостоятельно, а также проверить, какие значения использовать для -t. Несмотря на то, что даже если вы выполняете вдвое больше процессов, которые вам нужны, планировщик процессов в ядре должен иметь возможность справиться с этим без проблем, пока вы не насытите CPU, и в этом случае у вас будут большие проблемы. Я бы, вероятно, рекомендовал начать процесс для каждого гипертекстового ядра (на MRI).
Спасибо Стюарту за отличное разъяснение !! – Ryan
рубин 2.0 является «копией на дружественной записи» означает, что GC не будет делить общий доступ с копией на страницах записи в куче. с 1.9 вы отделите кучу единорогов, и GC запустит и переместит объекты и полностью уничтожит любое преимущество совместного использования COW, которое вы могли бы иметь между этими процессами до начала GC. – lamont