Этот блог не весь оригинальный, а на самом деле представляет собой сводку и сводку знаний.В нем я процитировал много контента из интернета и книг. Также даны соответствующие ссылки.
Эта статья включает в себя много знаний, вы можете искать соответствующий контент по ключевым словам и покупать соответствующие книги для систематического изучения. Будем критиковать и исправлять не то место.
Кто-то оставил мне сообщение, в котором говорилось: не пишите статьи для 100-миллионного уровня PV, просто используйте несколько программ с открытым исходным кодом, и вы сможете это сделать, пока не сделаете больших ошибок. Я так не думаю. Если вы используете ту же идею и используете базовые службы с более высокой производительностью, вы можете поддерживать больше параллельного трафика и экономить больше серверов. Идея оптимизации является ключевой.
Смотрите мою прямую трансляцию для обмена видео этого контента
Принципы оптимизации производительности
-
Оптимизация производительности основана на понимании бизнеса
-
Оптимизация производительности, архитектура и бизнес дополняют друг друга и неразделимы
Внедрение оптимизации производительности
Давайте сначала посмотрим на простую диаграмму веб-архитектуры.
Сверху вниз, от браузера пользователя до конечной базы данных, тогда мы говорим о внешней оптимизации.
Оптимизация внешнего интерфейса
Военные правила Yahoo:www.cnblogs.com/paul-3...
уменьшить количество http-запросов
-
Изображения, css, скрипты и т. д. увеличат количество http-запросов, а уменьшение количества этих элементов сократит время отклика. Также плохой практикой является запись нескольких JS и CSS в один файл, если это возможно. Также плохой практикой является запись изображений прямо на странице. Они должны быть написаны в CSS, а фон используется для поиска маленьких изображений после они собраны.
-
Теперь многие иконки сразу оформляются в шрифты, вектора высокого разрешения, а также уменьшают количество сетевых запросов
-
Текущие интерфейсные фреймворки разрабатываются с помощью компонентов и, наконец, упаковываются для создания одного файла js или двух файлов js + одного файла css или двух файлов css.
Воспользуйтесь кэшированием браузера
expires
,cache-control
,last-modified
,etag
blog.csdn.net/eroswang...
Для предотвращения кэширования, такого как обновления ресурсов, исходный подход:?v=xxxx
Теперь работа по упаковке внешнего интерфейса может генерировать /v1.2.0/xxx.js.
Используйте интерфейсные ресурсы распределенного хранилища
Наземный газ использует CDN для хранения внешних ресурсов
Доступ к ресурсам из нескольких доменов
-
Причина 1. Браузер имеет верхний предел количества одновременных запросов для одного и того же доменного имени, а несколько доменных имен поддерживают большее количество одновременных запросов.
-
Причина 2: Бесполезные файлы cookie — это кошмар при использовании одного и того же доменного имени.
Сжатие данных
-
включить gzip
-
Сжатие самого фронтального ресурса, компилирует пакет JS / CSS (удалить пространство, упрощенное упрощенное) сжатие ресурсов изображения и т. Д.
Оптимизировать скорость отображения первого экрана
-
Загрузка ресурсов по запросу, отложенная загрузкаmengkang.net/229.html
-
Ленивая загрузка изображений, слишком много изображений на презентации продукта Taobao, сколько людей смотрели на изображения, когда пользователи нажимали на них?
оптимизация nginx
на следующие три части
Оптимизация собственной конфигурации nginx
-
Сколько процессов установлено для worker_processes auto
-
worker_cpu_affinity аффинити привязка
-
worker_rlimit_nofile 65535 Максимальное количество файловых дескрипторов, открытых рабочим процессом.
-
worker_connections 65535 Максимальное количество соединений, обрабатываемых дочерним процессом.
-
мультиплексирование epoll
-
sendfile on — это оптимизация системных вызовов для файлового ввода-вывода, системный API
-
Если это обратный прокси-сервер, вам необходимо настроить параметры, связанные с fastcgi.
-
Возврат данных с включенным сжатием gzip
-
Статические ресурсы используют протокол кэширования http
-
Включить длительное соединение keepalive_timeout
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 256k;
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.0;
gzip_comp_level 2;
gzip_types text/plain application/x-javascript text/css application/xml text/javascript application/json;
gzip_vary on;
gzip_proxied expired no-cache no-store private auth;
gzip_disable "MSIE [1-6]\.";
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
}
Оптимизация конфигурации сетевого протокола tcp/ip
-
/proc/sys/net/ipv4/tcp_tw_recycle 1 Включить быструю перезапись сокетов TIME-WAIT в соединениях TCP, убедитесь, что tcp_timestamps = 1
-
/proc/sys/net/ipv4/tcp_tw_reuse 1 Разрешить повторное использование сокетов TIME-WAIT для новых соединений TCPmengkang.net/564.html
-
/proc/sys/net/ipv4/tcp_syncookies 0 Нужно ли вам отключать защиту от флуда, зависит от вашего бизнеса, например, шипы, вы должны отключить его
-
/proc/sys/net/ipv4/tcp_max_tw_buckets 180000 иначе часто
time wait bucket table overflow
-
tcp_nodelay on возвращает быстро для небольших файлов, и я не мог найти его, когда раньше монтировал диск через сеть.
-
tcp_nopush on
Оптимизация системы линукс
В дополнение к приведенной выше конфигурации сетевого протокола также зависит от системы, чтобы соответствовать настройкам в самом nginx, необходимо внести следующие изменения.
-
/proc/sys/net/core/somaxconn 65535
-
ulimit -a 65535
Более подробная инструкция по настройке оптимизации:OS.51CTO.com/art/20140 …
PHP-оптимизация
Обновите до PHP7
Обратите внимание, что многие функции и расширения заброшены, например, связанные с mysql, есть риски, хорошо поработайте над тестированием, а затем переключитесь.
кэш кода операции
Вроде встроено после php 5.5, нужно добавить в php.ini следующую конфигурацию
opcache.revalidate_freq=60
opcache.validate_timestamps=1
opcache.max_accelerated_files=1000
opcache.memory_consumption=512
opcache.interned_strings_buffer=16
opcache.fast_shutdown=1
-
opcache.revalidate_freq Этот параметр используется для установки времени истечения срока действия кеша (в секундах). Когда это время будет достигнуто, opcache проверит, изменился ли ваш код. В случае изменения PHP перекомпилирует его, сгенерирует новый код операции и обновит кеш.
-
opcache.validate_timestamps Когда этот параметр включен (установлен в 1), PHP будет проверять временную метку файла по истечении времени, установленного параметром opcache.revalidate_freq.
-
opcache.max_accelerated_files Этот параметр используется для управления максимальным количеством файлов PHP, которые могут кэшироваться в памяти.
-
opcache.memory_consumption Вы можете получить общий объем памяти, используемой opcache, вызвав opcachegetstatus()
-
opcache.interned_strings_buffer Строковое мультиплексирование opcache, единица измерения — МБ.
-
opcache.fast_shutdown=1 Включить события быстрой остановки и возобновления, в зависимости от модуля управления памятью движка Zend.
Использование огромной страницы php7
Роль Hugepage: косвенно улучшить частоту попаданий в кэш TLB таблицы поиска в процессе преобразования виртуальных адресов и адресов памяти.
opcache.huge_code_pages=1
Детали блога Bird Brother:www.laruence.com/2015/...
Кода псевдокомпонент
Взяв в качестве примера thinkphp, он объединяет и сжимает основные компоненты фреймворка (компоненты, которые необходимо использовать) в один файл, что не только сокращает системные вызовы поиска в каталоге и открытия файлов.
пройти черезstrace
Подпроцесс php-fpm может понимать процесс системных вызовов.В моем примере выше есть 12 системных вызовов для открытия файла (просто пример, причина, по которой моя установка относительного пути здесь приводит к еще двум поискам файлов). Если файлов 10, то есть 120 раз, эффект от оптимизации может быть не так очевиден, но это идея.
Кстатиset_include_path
Не используйте его, если он вам не нужен.Приведенный выше скриншот демо не может найти каталог, что является доказательством.
Компиляция шаблона
Шаблоны преобразуют их пользовательский синтаксис на синтаксис PHP для удобного анализа. Вместо того, чтобы разбирать его каждый раз.
xhprof находит узкие места в производительности
Скриншоты у меня неудачно загрузились.Так уж случилось, что в сообществе есть такой блог.Рекомендую.segmentfault.com/a/11...
оптимизация бизнеса
Ненавязчивая разработка расширений
Например, раньше была модель под названием «Вопросы и ответы», но теперь нам нужно разработать вознаграждаемые вопросы и ответы, которые должны поддерживать тематические вознаграждения, и в ней есть еще много функций. На этот раз следует использовать характеристики объектно-ориентированного наследования. вместо того, чтобы делать следующую разработку
<?php
class AskModel {
public function detail($id){
$info = 从数据库查询到该问题的信息;
// 逻辑1
// 逻辑2
}
}
<?php
class AskModel {
public function detail($id){
$info = 从数据库查询到该问题的信息;
// 逻辑1
if($info['type'] == 2){
//...
}else{
}
// 逻辑2
if($info['type'] == 2){
//...
}else{
}
}
}
Таким образом, есть больше логики и больше подтипов, и логическое суждение очень повторяющееся.Неэффективность программы может быть одним из аспектов, и тем более неподдерживаемым.
Независимо от домашней и деловой архитектуры, архитектура основана на понимании бизнеса. Затем внизпоследний живойPPT (сбой sf не может передавать изображения, это будет восполнено позже)
Асинхронное мышление
Пример:
-
Обработка отправки почты.
-
изображение Gearman обрезано.
-
Ajax загружает динамические данные на страницу.
-
Ленивая загрузка изображений, дважды щелкните изображение, чтобы увидеть увеличенное изображение.
-
На sf вы получаете уведомления о новых сообщениях через веб-сокет, но он не сообщает вам никаких новостей.Щелкните значок сообщения, чтобы асинхронно запросить определенные сообщения.
Это асинхронные идеи. Если вы можете идти шаг за шагом, идите шаг за шагом, а если вы не можете просить об этом, не просите.
Статический
Специальные страницы, такие как страницы seckill, предназначены для обработки большего трафика и параллелизма. И обновлять проще.
разделение бизнеса
Например, нужно ли проходить набор процессов всего фреймворка для только что упомянутой выше страницы темы? Зайти и сослаться на кучу файлов, инициализировать кучу всего? Это особенно неэффективно? Поэтому требуется бизнес-развязка, и если тематическая страница действительно нуждается в фреймворке (статическую страницу можно сгенерировать уже после первого посещения), она должна быть достаточно легковесной. Не путать с традиционным бизнесом.
Распределенная и SOA
Когда дело доходит до оптимизации бизнеса, мы действительно должны упомянуть архитектурные аспекты.После разделения бизнеса будут распределены и SOA, потому что этопоследний общий доступЯ уже сказал это, так что я не буду говорить больше.
Просто поговорим о специальном протоколе передачи сокетов soa.
Самое главное подчеркнуть в пользовательском заголовкеbody_len
, Обратите внимание на компактность, чтобы обеспечить кроссплатформенность
Уточнить:mengkang.net/586.html
Оптимизация MySQL
Статей, связанных с индексацией данных, в Интернете очень много, и вы можете добавить любые недостатки.
Дизайн таблиц — Embrace innodb
Тип innodb теперь используется в большинстве случаев. Конкретной причиной является мнение экспертов mysql.
Я не очень разбираюсь в оптимизации mysql, каждое подразделение - это огромный океан, а время и силы у всех ограничены, поэтому всем не обязательно изучать все глубоко, и часто важнее какие-то основы работы с компьютером.
обратитесь к этому pptstatic.mengkang.net/u...
Дизайн таблицы — Индекс первичного ключа
-
Innodb нужен первичный ключ, первичный ключ не должен использоваться в бизнес-целях и не должен изменять первичный ключ.
-
Лучше всего поддерживать возрастание первичного ключа по порядку, так как случайный первичный ключ будет вызывать частое разбиение дерева кластеризованного индекса, увеличение количества случайных операций ввода-вывода, дискретных данных и снижение производительности.
Пример:
Некоторые индексы в предыдущем проекте былиarticle_id
+ tag_id
Первичный ключ, созданный объединением, в данном случае является бизнес-атрибутом. Первичный ключ не увеличивается последовательно, и каждая вставка новых данных может привести к большим изменениям индекса (понимание принципа индекса базы данных b+).
Дизайн таблицы — выбор поля
-
Можно выбрать короткое целое, длинное целое не голосовать. Например, артикль в значении состояния, его может быть не более 100 видов, а как расширение, не нужно использовать межд.
-
Вы можете избегать char varchar, например, ресурсы изображений имеют хэш-код фиксированной длины 20, тогда вы можете выбрать char.
-
При использовании varchar длины достаточно, не злоупотребляйте ею.
-
Отдельно выделяется крупный текст, например подробности статьи, отдельная таблица. Другая основная информация помещается в таблицу, а затем связывается.
-
Использование избыточных полей, таких как поле сведений о статье, добавляет поле после синтаксического анализа уценки статьи.
Оптимизация индекса
В большинстве случаев сканирование индекса выполняется быстрее и лучше, чем полное сканирование таблицы. Но это не абсолютно, например, искомые данные составляют большую часть всей таблицы данных, но использование индексов медленнее.
-
Не обновляйте индекс, может привести к полному содержанию данных таблицы заблокирован. Поэтому, когда вы хотите обновить индекс.
-
Использование федеративных индексов
-
Использование объяснить
Комбинированный индекс «крайний левый префикс», оптимизатор запросов также поможет вам настроить порядок условных выражений в соответствии с требованиями комбинированного индекса.
CREATE TABLE `test` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`a` int(10) unsigned NOT NULL,
`b` int(10) unsigned NOT NULL,
`c` int(10) unsigned NOT NULL,
PRIMARY KEY (`id`),
KEY `index_abc` (`a`,`b`,`c`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
можно использовать индекс
explain select * from test where a=1;
explain select * from test where a=1 and b=2;
explain select * from test where a=1 and b=2 and c=3;
explain select * from test where a=1 and b in (2,3) and c=3;
explain select * from test where a=1 and b=2 order by c desc;
нельзя использовать индекс
explain select * from test where a=1 and b in (2,3) order by c desc;
explain select * from test where b=2;
объясни нашел хороший:blog.csdn.net/woshiqjs...
Очень важный параметрtype
,key
,extra
тип самый распространенный
system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL
ценность | инструкция |
---|---|
const | Найдите соответствующую строку непосредственно через индекс, как правило, когда индексируется первичный ключ. |
ref | Условный индекс без индекса первичного ключа или уникального индекса, результат запроса состоит из нескольких строк, что очень часто встречается в объединенном запросе. |
index | По индексу может быть и другая сортировка, куда или группировать по и т.д. |
all | Полное сканирование таблицы, индексы не используются |
extra
Если естьUsing filesort
илиUsing temporary
Если да, то его нужно оптимизировать.
Собирать медленные запросы
Добавить в конфигурацию my.ini
long_query_time=2
log-slow-queries=/data/var/mysql_slow.log
использовать nosql
Богатые типы данных Redis очень подходят для выполнения некоторых реляционных запросов с mysql. Например, очень сложный список запросов может быть вставлен в zset в виде отсортированного списка, а затем конкретная информация может быть запрошена в mysql через документ в zset.
Оптимизация кеша
многоуровневый кэш
-
Кэш в запросе
static
Переменное хранение, например информационный поток круга друзей, когда 20 единиц информации получают за один раз, возможно, что 30 из 20 человек, поставивших лайк, являются дубликатами. изображения, поэтому в настоящее время было бы более эффективно использовать статический массив для хранения основной информации об этих пользователях. -
Запрос локального кеша закончился, потяните вниз, чтобы обновить круг друзей, и снова появится тот же самый друг выше, и вам придется запросить его снова. Таким образом, локальный резидентный кеш памяти более эффективен.
-
Распределенный кеш уже был запрошен на сервере А и выделяется серверу Б, когда он извлекается для обновления. Проверяются ли те же данные еще раз и сохраняются ли они в локальном кеше сервера Б? Получите распределенный кеш. Это предотвращает дублирование запросов . Но на этом шаге есть еще сетевой запрос.
Часто эти три сосуществуют.
Кэш во избежание злоупотреблений
анализ случая
-
Обновление пользовательских баллов
-
Например, основная информация пользователя и баллы смешиваются вместе, и баллы начисляются, когда пользователь входит в систему. Затем нужно обновить очки пользователя.В это время обновить кэш базовой информации всего пользователя?
-
Так что здесь вы также можете использовать следующие принципы шардинга хэшей для обновления
-
-
Кэши привязки подарков и тем смешивают и кэшируют несколько источников данных для удобства извлечения данных.По сравнению с тем, что вы, возможно, видели, это катастрофический дизайн.
{
id:x,
title:x,
gift:{
id:x,
name:x,
img:x,
}
}
Если нужно обновить изображение подарка, необходимо обновить кеши всех тем, в которых использовался подарок.
Пример сценария использования Redis
Поскольку старые драйверы с хорошей базовой базой можно игнорировать, новички могут взглянутьmengkang.net/356.html
оптимизация Redis
-
Мультиэкземпляры, более эффективное использование серверного процессора
-
Оптимизация памяти, официальное мнениеRedis.IO/темы/памятка…немного старый
-
Максимально используйте хэши с низкой временной сложностью и высокой эффективностью запросов. Это также экономит память. Instagram впервые использовал строки для хранения
图片id=>uid
Использовались реляционные данные 21 г, а затем они были заменены на горизонтальное деление, идентификатор изображения был по модулю 1000, а затем данные фрагмента были сохранены в виде хэша, так что итоговое содержимое было уменьшено на 5 г, что в основном четверть.
Каждый сегмент хранится в хеш-структуре.Поскольку хэш-структура будет сжиматься и сохраняться, когда один элемент хэша меньше определенного числа, это может сэкономить много памяти. Этого нет в структуре String. И это определенное число контролируется параметром hash-zipmap-max-entries в файле конфигурации.
Улучшенная осведомленность о сервере
Следующий контент может дать вам только общее представление и понимание направления оптимизации Конкретный контент требует систематического изучения большого количества знаний.
Преимущества нескольких процессов
Многопроцессорные вычисления способствуют дублированию операций ЦП и операций ввода-вывода. Процесс потребляет большую часть времени в дисковом вводе-выводе и в сетевом вводе-выводе. Если процесс является одним процессором, когда много времени ожидания ввода-вывода, поэтому нам нужно использовать несколько процессов.
уменьшить переключение контекста
Чтобы позволить всем процессам по очереди использовать системные ресурсы, планировщик процессов приостанавливает запущенные процессы, когда это необходимо, и возобновляет ранее приостановленный процесс. Это то, что мы часто называем «переключением контекста».
Про контекст я писал краткую заметку ранееmengkang.net/729.html
Увеличение количества процессов без ограничения увеличит количество переключений процессора между процессами.
Если мы хотим, чтобы сервер поддерживал большое количество параллелизма, мы должны минимизировать количество переключений контекста на долгое время, например, количество дочерних процессов nginx на сервисе nginx не должно превышать количество ядер процессора.
Мы можем пройти стресс-тестvmstat
,nmon
Система для отслеживания количества переключений контекста.
IOwait не обязательно занят вводом-выводом
# top
top - 09:40:40 up 565 days, 5:47, 2 users, load average: 0.03, 0.03, 0.00
Tasks: 121 total, 2 running, 119 sleeping, 0 stopped, 0 zombie
Cpu(s): 8.6%us, 0.3%sy, 0.0%ni, 90.7%id, 0.2%wa, 0.0%hi, 0.2%si, 0.0%st
В общем, IOwait представляет собой пропорцию времени операции ввода-вывода (время операции ввода-вывода + время ввода-вывода и процессорное время). Но время выбрано неправильно. Например, когда nginx используется в качестве веб-сервера, когда мы запускаем много подпроцессов nginx, IOwait будет очень высоким. Когда количество процессов сокращается почти до числа ядер процессора, IOwait уменьшится, а сетевой трафик мониторинга тоже увеличится.
Использование мультиплексированного ввода/вывода
пока это предусмотреноsocket
услуги, вы можете воспользоваться преимуществами модели мультиплексного ввода/вывода.
Надо дополнить знанияmengkang.net/726.html
Сокращение системных вызовов
strace очень удобно считать системные вызовы
# strace -c -p 23374
Process 23374 attached - interrupt to quit
^CProcess 23374 detached
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
30.68 0.000166 0 648 poll
12.01 0.000065 0 228 munmap
11.65 0.000063 0 228 mmap
10.54 0.000057 0 660 recvfrom
10.35 0.000056 0 708 fstat
7.76 0.000042 0 252 open
6.10 0.000033 1 36 write
5.73 0.000031 0 72 24 access
5.18 0.000028 0 72 read
0.00 0.000000 0 276 close
0.00 0.000000 0 13 13 stat
0.00 0.000000 0 269 240 lstat
0.00 0.000000 0 12 rt_sigaction
0.00 0.000000 0 12 rt_sigprocmask
0.00 0.000000 0 12 pwrite
0.00 0.000000 0 48 setitimer
0.00 0.000000 0 12 socket
0.00 0.000000 0 12 connect
0.00 0.000000 0 12 accept
0.00 0.000000 0 168 sendto
0.00 0.000000 0 12 shutdown
0.00 0.000000 0 48 fcntl
0.00 0.000000 0 12 flock
0.00 0.000000 0 156 getcwd
0.00 0.000000 0 24 chdir
0.00 0.000000 0 24 times
0.00 0.000000 0 12 getuid
------ ----------- ----------- --------- --------- ----------------
100.00 0.000541 4038 277 total
пройти черезstrace
См. «Время системного вызова» и «Количество вызовов», чтобы найти проблему.Huoding.com/2013/10/0 …
Создайте свой собственный веб-сервер
Чтобы понять принцип оптимизации веб-сервера, лучший способ - понять его и ауты. Практика - лучший способ. Я разделяю его на следующие шаги:
-
Используйте PHP для реализации динамического веб-сервераmengkang.net/491.html
-
Реализация простого статического веб-сервера (петлевого сервера)mengkang.net/563.html
-
Практика многопроцессорного параллельного веб-сервера, ориентированного на соединениеmengkang.net/571.html
-
Реализация простого статического веб-сервера выбораmengkang.net/568.html
-
Мультиплексирование ввода/выводаmengkang.net/726.html
Вышеупомянутые мои конспекты исследования Ресурсы изображений потеряны Вы можете искать связанные статьи и книги по релевантным ключевым словам, и я рекомендую всем читать книги.