Эта статья является зеркальной статьёй машинного перевода, пожалуйста, нажмите здесь, чтобы перейти к оригиналу.

Вид: 6958|Ответ: 1

Многопоточность ставит масштабируемость в тупик

[Скопировать ссылку]
Опубликовано 06.12.2014 22:21:58 | | |
Это статья из мира Python, но она всё ещё применима ко всей области программирования, хотя многопоточность позволяет быстрее обрабатывать запросы, но есть и потолок, и зелёные (микропотоки) потоки — это решение.

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

Решение этих проблем требует изменения моделей программирования с использованием асинхронных событий и механизмов обратного вызова. В Druva мы создали библиотеку Python под названием Dhaga для решения масштабных задачСовместность, при этом модель программирования не требует значительных изменений.

Разработчики программного обеспечения живут в одном из нихСовместностьМир. Потоки сегодня являются первоклассными гражданами, особенно в процессе разработки, особенно когда ваше приложение выполняет интенсивные сетевые операции, например, система inSync (продукт для синхронизации сетевой безопасности), например Druva. Многопоточность делает процесс программного кода для сетевых операций простым и упорядоченным. Когда нашему приложению нужны улучшения производительности, его можно улучшитьУпругость, мы можем увеличить количество потоков.

Но когда речь идёт о тысячах масштабовСовместностьЗапросов, потоков недостаточно.

Мы обнаружили, что многопоточность имеет следующие недостатки:
1. Системный клиент inSync должен резервно копировать большое количество файлов на сервер через сетевые вызовы RPC. Типичный способ для разработчиков ускорить процесс — использовать потоки. Однако производительность, обеспечиваемая многопоточностью, увеличивает стоимость памяти и процессора; Разработчикам нужно поддерживать баланс между скоростью и количеством потоков.

2. Наши серверы должны работать между системой inSync и тысячами клиентовСовместностьПодключения и уведомления. Для эффективной обработки соединений мы используем потоки для обработки запросов. Но растущее число клиентов систем inSync также означает, что нам нужно продолжать увеличивать количество потоков, что потребляет много серверной памяти и процессора.

3. Наш веб-сервер должен обрабатывать тысячи параллельных HTTP-запросов. Большая часть работы связана с сетевыми сокетами, которые принимают и отправляют данные и передают их на бэкенд системы inSync. Из-за этого большинство потоков ждут сетевых операций. Вызывая проблему C10K, когда к веб-серверу поступает тысячи синхронных запросов, генерация потока для каждого запроса практически немасштабируема (масштабирование).

Ограничения асинхронных фреймворков
Многие асинхронные фреймворки, включая Twisted, Tornado Tornado и asyncore, могут помочь разработчикам отказаться от популярных способов использования потоков. Эти фреймворки основаны на неблокирующих сокетах и механизмах обратного вызова (аналогично Node.js). Если мы будем использовать эти фреймворки как есть, основные части нашего кода Druva придётся рефакторить. Это не то, чего мы хотим делать. Рефакторинг кода увеличивает циклы разработки и тестирования, мешая нам соответствовать требованиям масштаба. Учитывая, что несколько частей продукта должны быть огромными, каждому из нас придётся их рефакторить — отсюда и усилия удвоения или утроения.

Чтобы не менять слишком много кода, нам пришлось отказаться от прямого использования существующего фреймворка. К счастью, мы нашли полезные инструменты.

Поскольку мы хотим контролировать выполнение кода в сетевом ввода-выводе, нам нужен способ разделить поток на микропотоки. Мы находимГринлетс。 Он обеспечивает неявное планирование микропотоков, называемое ко-рутин корутиной. Другими словами. Это полезно, когда вы хотите контролировать работу кода. Можно создавать микропотоки для пользовательских расписаний, потому что можно контролировать, когда гринлеты дают паузы. Это идеально для нас, потому что даёт полный контроль над расписанием нашего кода.

Tornado — это простой, не блокирующий веб-серверный фреймворк, написанный на Python, предназначенный для обработки тысяч асинхронных запросов. Мы используем его основной компонент — IOLoop IOStream. IOLoop — это цикл событий ввода-вывода без блокировки сокета; Он использует epoll (на Linux) или очереди (BSD и Mac OS X), в противном случае выбирайте (на Windows), если они доступны. IOStream предоставляет неблокирующие соёма, такие как удобная упаковка для чтения и записи. Мы делегируем все операции сокета Tornado, а затем используем обратные вызовы для запуска операций с кодом для завершения (примечание banq: очень похоже на Node.js механизм).

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

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

Дхага (от хинди означает нить) — это каркас для исполнения лёгкой нити, которую мы абстрагируем. Класс Dhaga производится от greenlets и использует коммутацию стека для выполнения нескольких потоков кода в одном потоке операционной системы. Потоки одной операционной системы выполняют несколько дхагасов с помощью совместного планирования. Всякий раз, когда дхага ждёт (в основном ожидая возвращения вызова RPC), она передаёт управление родительскому уровню (то есть контексту выполнения потока на уровне ОС, который её создал). Родительский уровень затем назначает ещё одну дхагу, чтобы быть готовой к проведению. RPC-вызов передаётся на веб-сервер торнадо для асинхронной записи сокета, затем регистрируется обратный вызов при возврате, и когда этот RPC возвращается, ожидающая дхага добавляется в исполняемую очередь и затем принимается родительским потоком. (Примечание Банка: похоже на node.js принцип)

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







Предыдущий:Шаблон фреймворка MVC мертв.
Следующий:Преимущества и недостатки фреймворков MVC:
Опубликовано 07.12.2014 17:22:55 |
Читать и отвечать — это добродетель
Отказ:
Всё программное обеспечение, программные материалы или статьи, публикуемые Code Farmer Network, предназначены исключительно для учебных и исследовательских целей; Вышеуказанный контент не должен использоваться в коммерческих или незаконных целях, иначе пользователи несут все последствия. Информация на этом сайте взята из Интернета, и споры по авторским правам не имеют отношения к этому сайту. Вы должны полностью удалить вышеуказанный контент с компьютера в течение 24 часов после загрузки. Если вам нравится программа, пожалуйста, поддержите подлинное программное обеспечение, купите регистрацию и получите лучшие подлинные услуги. Если есть нарушение, пожалуйста, свяжитесь с нами по электронной почте.

Mail To:help@itsvse.com