Не завидуйте мандаринкам или бессмертным, а корректируйте строчку кода долго. Оригинал: Miss Sister Taste (идентификатор публичной учетной записи WeChat: xjjdog), добро пожаловать, пожалуйста, сохраните источник для перепечатки.
На выходных меня задушил маленький одноклассник. Он хочет обсудить со мной, является ли Redis многопоточным или однопоточным. Этот вопрос можно было бы объяснить лучше, но я столкнулся с рычагом.
Ответ очевиден: redis6, который не может избежать истинной теоремы аромата, ввел многопоточность; до redis6 он был однопоточным.
Тем не менее, это не вопрос «да» или «нет», он также включает в себя второе измерение.版本
принимать участие.
Однако этот одноклассник хочет ударить меня в лицо. Разве вы не знаете, что лицо мисс-сестры очень нежное? Неприкасаемый.
"По вашей логике, redis5 однопоточный?"
"Да."
«Тогда что не так со скриншотом ниже?»
Мой одноклассник бросил мне фотографию и посмотрел на меня с презрением.
"использоватьtop -Hp
Проверять. redis5 имеет 4 потока. Как объяснить? "
Я не знаю, как это объяснить ему. Используйте верхнюю команду для наблюдения, Redis5 должен быть многопоточным, таким какbgsave
,aof
Подождите, вы должны запустить поток для работы, иначе он уже давно взорвется.
Согласно этой логике, в Redis никогда не было ни одного процесса. Глядя на эту картину, я впадал в бесконечную грусть.
«Является ли Redis единым процессом, в основном для операций чтения и записи Redis». Но эта фраза не убедительна для гангстера.
«Написание программ должно быть строгим, вы, люди, слишком неточны. Многопоточность — это многопоточность, вы должны спросить «redis», что операции чтения и записи являются многопоточными».
Я прошу вас сидеть утка. Я не хочу с ним общаться, потому что мне стыдно за его эрудицию.
Но его следующий вопрос заставил меня погрузиться в настоящую медитацию.
1. Насколько быстро работает многопоточность Redis?
Каково улучшение производительности многопоточности Redis?
Официальное заявление: possible to easily speedup two times
. Возможно, будет проще увеличить скорость вдвое.
Мой английский не очень хорош, и меня очень смущают такого рода английские модификации. теперь, когдаeasily
Ну почему ещеpossible
.two times
, в итоге увеличивается в 2 раза или увеличивается до 2 раз.
Чиновник сказал, что насколько его можно улучшить, зависит от возможностей железа.
Официальная рекомендация заключается в том, что только когда количество ядер ЦП достигает 4, необходимо попробовать эту многопоточную функцию.
Не смотрите на меня глазами местных тиранов, эта 4-ядерная конфигурация убила большинство компаний. Таким образом, Redis полностью отключает функцию многопоточности. (кажется немного небрежным)
Я могу обратиться только к своим бывшим коллегам на передовой. Использовали ли они этот эпохальный многопоточный Redis6x в производственной среде?
Результаты меня очень удовлетворили, нет!
Один из них ответил, что я особенно доволен. Он сказал: «Вы спрашиваете меня, останусь ли я в JDK1.6, я запускал версию Redis для Windows, я использовал Redis6. Я все еще использую Redis3».
Другой ответ, который меня больше удовлетворил, гласил: «Уходи!»
2. Как им пользоваться?
Новую технологию надо расхваливать, иначе никто не будет практиковать наступать на яму, а как ведомый можно только жрать.
Теоретически многопоточность определенно улучшит производительность. Один отец зарабатывает деньги, а два отца зарабатывают деньги, эффект, естественно, разный, но страдает мать.
Чтобы включить многопоточность Redis6, вам необходимо настроить параметр.
io-threads 4
Если этот параметр включен, только исходящий трафик использует многопоточность.Если вы хотите использовать многопоточность для входящего трафика, вы также можете настроить следующие параметры.
io-threads-do-reads yes
Благодаря чему эти два параметра вы можете увидеть, что текущий Multi-Threading Redis все еще немного потертый.
После того, как мы его включаем, мы по-прежнему используем top -Hp для просмотра связанных процессов, и мы можем видеть, что есть еще 3io_thd
процесс.
Эта часть логикиnetworking.c
вроде понял. Этот файл достиг более 3 тысяч строк, что достаточно много.
3. Почему Redis снова использует многопоточность?
Используя тест redis-benchmark, пропускная способность одной машины и одного ядра может достигать 10 Вт+.
1 Второй - 1000000000 наносекунднов, одна операция памяти составляет около 100 наносекунд, а операция памяти может достигать скорости 1000 Вт / с. Где узкое место redis?
Используя perf для отслеживания, вы можете обнаружить его трудоемкость, в основном отраженную вsys_write
На системные вызовы, то есть запись данных в сокет.
Теперь, когда узкое место найдено, оптимизируйте его. Способ, который выбирает Redis, заключается в использовании многопоточности.
Для проверки я использовал бенчмарк: на 4-ядерной машине, когда процессор был загружен, QPS достигал 16 Вт, что не удваивалось (по сравнению с одноядерным 9 Вт/с).
benchmark 6379 clients 32
164519.20 requests per second
165411.09 requests per second
С таким мощным аппаратным обеспечением получить такое ограниченное улучшение производительности далеко не удовлетворительно.
Нетрудно объяснить, почему так мало людей практикуют его сейчас. Вышел из-за нового, еще недостаточно привлекательного.
В конце концов, на 4-ядерной машине я развертываю три экземпляра кластера Redis, что теоретически увеличится втрое.
файл конфигурации redis, в комментариях к этой новой функции много контента.
4. Как этого добиться?
Как показано на рисунке, запрос redis должен установить соединение, затем получить команду операции, затем выполнить команду и, наконец, записать результат ответа в сокет.
В многопоточном режиме redis есть два процесса получения, парсинга команд и вывода результатов, которые можно настроить как многопоточное выполнение, ведь все-таки это основная трудоемкая точка, которую мы локализуем.
Но выполнение команды, то есть операция памяти, все еще однопоточная.
Этот дизайн создает характеристику.
У Redis по-прежнему нет проблем с конкуренцией многопоточных блокировок и безопасностью потоков, потому что его шаг чтения данных по-прежнему является однопоточным и требует постановки в очередь для запуска. Некоторые трудоемкие операции, такие какkeys *
,hgetall
Подождите, еще обратите внимание.
Redis — это не традиционная модель реактора, честно говоря, если многое — это жесткие понятия, то они могут попасть только в голову и просочиться из хвоста. Это не master, worker, чистая модель, похожая на memcached, поскольку извлекает операции выполнения команд. Причина достаточно, чтобы увидеть картинку выше.
End
Затем возникает следующая проблема, которая привлекает внимание: в этом сценарии многопоточного приложения требуется ли Redis интенсивный ввод-вывод или интенсивные вычисления?
Возможно, если вездесущий опрос в многопоточности redis относится к «вычислениям», его можно рассматривать как ресурсоемкое приложение.
Об авторе:Мисс сестра вкус(xjjdog), публичная учетная запись, которая не позволяет программистам идти в обход. Сосредоточьтесь на инфраструктуре и Linux. Десять лет архитектуры, десятки миллиардов ежедневного трафика, обсуждение с вами мира высокой параллелизма, дающие вам другой вкус. Мой личный WeChat xjjdog0, добро пожаловать в друзья для дальнейшего общения.