Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

ТОП ошибок в инфраструктуре, мешающих высоким нагрузкам / Андрей Половов (Флант)

1,300 views

Published on

РИТ++ 2017, HighLoad Junior
Зал Сингапур, 5 июня, 14:00

Тезисы:
http://junior.highload.ru/2017/abstracts/2706.html

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

Published in: Engineering
  • Be the first to comment

  • Be the first to like this

ТОП ошибок в инфраструктуре, мешающих высоким нагрузкам / Андрей Половов (Флант)

  1. 1. ТОП ошибок в инфраструктуре, мешающих высоким нагрузкам Андрей Половов Андрей Колаштов
  2. 2. Привет! # whoami andrey.polovov # hostname -d flant.ru # whoami andrey.kolashtov # hostname -d flant.ru
  3. 3. 24×7×365 L1/L2/L3/+ DevOps SLA + =
  4. 4. Наши клиенты Первый канал Forbes.ru Лепра и Dirty Ситимобил # capsh --print | grep clients
  5. 5. О чём доклад?
  6. 6. О чём доклад? Проблемы с базами
  7. 7. О чём доклад? Проблемы с базами Проблемы с кодом
  8. 8. О чём доклад? Проблемы с базами Проблемы с кодом Проблемы с архитектурой
  9. 9. О чём доклад? Проблемы с базами Проблемы с кодом Проблемы с архитектурой Проблемы с сетью
  10. 10. О чём доклад? Проблемы с базами Проблемы с кодом Проблемы с архитектурой Проблемы с сетью Человеческий фактор
  11. 11. Disclaimer
  12. 12. Проблемы с базами
  13. 13. Распространённость Влияние на производительность Сложность решения Проблемы с базами / Транзакции
  14. 14. Проблемы с базами / Транзакции SELECT # Получить текст UPDATE # Обновить счётчик UPDATE # Начислить автору денег UPDATE # Списать деньги из бюджета # Σ 4 Disk IO
  15. 15. Проблемы с базами / Транзакции START TRANSACTION; SELECT # Получить текст UPDATE # Обновить счётчик UPDATE # Начислить автору денег UPDATE # Списать деньги из бюджета COMMIT; # Σ 2 Disk IO
  16. 16. Проблемы с базами / Транзакции ~ $ time php insert_300k_rows.php real 6m13.465s ~ $ time php insert_300k_rows_transaction.php real 0m32.298s
  17. 17. Проблемы с базами / Транзакции SET autocommit = 1; mysql_query(“UPDATE `tbl` SET `a` = 1 WHERE `b` = 2”);
  18. 18. Проблемы с базами / Транзакции Изучайте лог запросов (binlog или general.log) Диагностика:
  19. 19. Проблемы с базами / Транзакции Изучайте лог запросов (binlog или general.log) N коммитов ≈ N апдейтов ➡ Cкорее всего проблема Диагностика:
  20. 20. Проблемы с базами / Индексы Распространённость Влияние на производительность Сложность решения
  21. 21. Проблемы с базами / Индексы Мало данных – нет проблем
  22. 22. Проблемы с базами / Индексы ↑ Данные ↑ full scan ↑ t query ↑ Disk IO
  23. 23. Проблемы с базами / Индексы Продумать индекс при создании таблицы Как быть программисту:
  24. 24. Проблемы с базами / Индексы Продумать индекс при создании таблицы Изменили запрос — продумали индекс Как быть программисту:
  25. 25. Проблемы с базами / Индексы Вычисляете запрос (slow_log, newrelic, okmeter.io) Как быть админу:
  26. 26. Проблемы с базами / Индексы Вычисляете запрос (slow_log, newrelic, okmeter.io) explain Как быть админу:
  27. 27. Проблемы с базами / Индексы Вычисляете запрос (slow_log, newrelic, okmeter.io) explain Как быть админу: Добавляете индекс
  28. 28. Проблемы с базами / Жадные запросы Распространённость Влияние на производительность Сложность решения
  29. 29. База (200Mbit) Фронт (5Mbit)
  30. 30. Проблемы с базами / Жадные запросы SELECT * FROM `t`;
  31. 31. Проблемы с базами / Итого Будьте конкретнее в своих запросах
  32. 32. Проблемы с базами / Итого Будьте конкретнее в своих запросах Помните об индексах
  33. 33. Проблемы с базами / Итого Будьте конкретнее в своих запросах Помните об индексах Транзакции помогут снять нагрузку с БД
  34. 34. Проблемы с кодом
  35. 35. Проблемы с кодом / HTTP-api Распространённость Влияние на производительность Сложность решения
  36. 36. Проблемы с кодом / HTTP-api $resp = http_get(“http://news.example.com/api/last.php”);
  37. 37. Проблемы с кодом / HTTP-api Смерть apache: 1 запрос = 1 воркер
  38. 38. Проблемы с кодом / HTTP-api Смерть apache: 1 запрос = 1 воркер Воркеры долго висят
  39. 39. Проблемы с кодом / HTTP-api Смерть apache: 1 запрос = 1 воркер Воркеры долго висят MaxClients
  40. 40. Проблемы с кодом / HTTP-api 1 запрос = 1 воркер Воркеры долго висят Смерть apache: MaxClients Connection Timed Out
  41. 41. Проблемы с кодом / HTTP-api Что делать? Ищите workaround:
  42. 42. Проблемы с кодом / HTTP-api Что делать? Ищите workaround: Кэшируйте запросы
  43. 43. Проблемы с кодом / HTTP-api Что делать? Ищите workaround: Кэшируйте запросы Используйте MQ
  44. 44. Проблемы с кодом / HTTP-api Ищите workaround: Кэшируйте запросы Что делать? Используйте MQ Поставьте тайм-аут 1 сек
  45. 45. Проблемы с кодом / HTTP-api newrelic → web external (или любой профайлер) Как диагностировать? netstat -natup или tcpdump
  46. 46. Проблемы с кодом / cron Распространённость Влияние на производительность Сложность решения
  47. 47. Проблемы с кодом / cron http://example.com/cron/action1.php
  48. 48. Проблемы с кодом / cron http://example.com/cron/action1.php set_time_limit(0);
  49. 49. Проблемы с кодом / cron http://example.com/cron/action1.php set_time_limit(0); * * * * * www-data curl http://example.com/cron/action1.php
  50. 50. Проблемы с кодом / cron Что плохого? Лишний воркер
  51. 51. Проблемы с кодом / cron Что плохого? Лишний воркер Долго висят воркеры
  52. 52. Проблемы с кодом / cron Лишний воркер Долго висят воркеры Что плохого? MaxClients
  53. 53. Проблемы с кодом / cron Что делать? Используйте cli
  54. 54. Проблемы с кодом / cron Что делать? Используйте cli Устанавливайте таймауты
  55. 55. Проблемы с кодом / cron Используйте cli Устанавливайте таймауты Что делать? Ставьте локи (утилита setlock)
  56. 56. Проблемы с кодом / Итого Будьте внимательны к cron-заданиям
  57. 57. Проблемы с кодом / Итого Будьте внимательны к cron-заданиям Не пользуйтесь HTTP-api напрямую
  58. 58. Архитектурные проблемы
  59. 59. Архитектурные проблемы / Одинокий apache Распространённость Влияние на производительность Сложность решения
  60. 60. Архитектурные проблемы / Одинокий apache apache280
  61. 61. Архитектурные проблемы / Одинокий apache Что плохого? Статика (jpg, css, js, ...)
  62. 62. Архитектурные проблемы / Одинокий apache Медленные клиенты Статика (jpg, css, js, ...) Что плохого?
  63. 63. Архитектурные проблемы / Одинокий apache Что делать? Используйте nginx location ~* ^/.+.(jpg|css|js)$ { root /web/example.com/public/; }
  64. 64. Apache 46% nginx 20% Microsoft IIS 8% Google 8% Other 18% Доля веб-серверов, апрель 2017
  65. 65. Распространённость Влияние на производительность Сложность решения Архитектурные проблемы / PHP-сессии
  66. 66. Архитектурные проблемы / PHP-сессии
  67. 67. Архитектурные проблемы / PHP-сессии Что делать? Храните PHP-сессии в памяти!
  68. 68. Распространённость Влияние на производительность Сложность решения Архитектурные проблемы / stateful-код
  69. 69. Архитектурные проблемы / stateful-код
  70. 70. Архитектурные проблемы / stateful-код
  71. 71. Архитектурные проблемы / stateful-код Враги stateless: Локальные файловые хранилища
  72. 72. Архитектурные проблемы / stateful-код Локальные файловые хранилища Экзотические БД Враги stateless:
  73. 73. Архитектурные проблемы / stateful-код Храните файлы в S3 (NFS только как временное решение!) Не используйте экзотические БД Как быть?
  74. 74. Распространённость Влияние на производительность Сложность решения Архитектурные проблемы / HTTP-кеш
  75. 75. Архитектурные проблемы / HTTP-кеш
  76. 76. Архитектурные проблемы / HTTP-кеш http://conf.ontico.ru/live/
  77. 77. Архитектурные проблемы / HTTP-кеш http://conf.ontico.ru/live/ GET /api/live/current.json?thread=436630 GET /api/live/next.json?thread=475171
  78. 78. Архитектурные проблемы / HTTP-кеш http://conf.ontico.ru/live/ location ~* "^/api/live/(current|next).json" { proxy_cache conf_ontico_ru; proxy_cache_key $request_uri; proxy_cache_valid 1m; ... proxy_pass http://web-conference; }
  79. 79. Архитектурные проблемы / Итого Кеш — главная помощь при highloadКеш — главная помощь при highload
  80. 80. Архитектурные проблемы / Итого Не оставляйте apache одного Кеш — главная помощь при highload
  81. 81. Архитектурные проблемы / Итого Не оставляйте apache одного Храните PHP-сессии в памяти Кеш — главная помощь при highload
  82. 82. Архитектурные проблемы / Итого Не оставляйте apache одного Храните PHP-сессии в памяти Пишите stateless-приложения Кеш — главная помощь при highload
  83. 83. Сетевые проблемы
  84. 84. Распространённость Влияние на производительность Сложность решения Сетевые проблемы / persistent connect
  85. 85. Сетевые проблемы / persistent connect
  86. 86. Сетевые проблемы / persistent connect Чем грозят “короткие” соединения Оверхед CPU на создание сокетов Оверхед на TCP syn, ack...
  87. 87. Сетевые проблемы / persistent connect Чем грозят “короткие” соединения Оверхед CPU на создание сокетов Оверхед CPU на инициализацию сессии в БД Оверхед на TCP syn, ack...
  88. 88. Сетевые проблемы / persistent connect Оверхед CPU на создание сокетов Оверхед CPU на инициализацию сессии в БД Чем грозят “короткие” соединения Обилие TIME_WAIT-сокетов Оверхед на TCP syn, ack...
  89. 89. Сетевые проблемы / persistent connect Решение для PG PGBouncer
  90. 90. Сетевые проблемы / persistent connect upstream backend { keepalive 100; server 10.1.1.5; } ... proxy_http_version 1.1; proxy_set_header Connection ""; ...
  91. 91. Распространённость Влияние на производительность Сложность решения Сетевые проблемы / TIME_WAIT-сокеты
  92. 92. Сетевые проблемы / TIME_WAIT-сокеты Оверхед CPU на проверку входящего пакета Чем грозят TIME_WAIT-сокеты:
  93. 93. Сетевые проблемы / TIME_WAIT-сокеты Чем грозят TIME_WAIT-сокеты: Памяти почти не просят Оверхеда CPU на исходящие пакеты нет При этом: Оверхед CPU на проверку входящего пакета
  94. 94. Сетевые проблемы / TIME_WAIT-сокеты ~ $ sudo netstat -natu | grep TIME_WAIT | wc -l 47572
  95. 95. Сетевые проблемы / TIME_WAIT-сокеты net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_tw_recycle = 1 Решение:
  96. 96. Сетевые проблемы / TIME_WAIT-сокеты net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_tw_recycle = 1 Решение:
  97. 97. Сетевые проблемы / TIME_WAIT-сокеты net.ipv4.tcp_tw_reuse = 1 persistent connections Правильное решение:
  98. 98. Распространённость Влияние на производительность Сложность решения Сетевые проблемы / Плохой канал
  99. 99. Сетевые проблемы / Плохой канал Коммунальное облако
  100. 100. Сетевые проблемы / Плохой канал
  101. 101. Сетевые проблемы / Плохой канал
  102. 102. Сетевые проблемы / Плохой канал
  103. 103. Сетевые проблемы / Итого Используйте управляемую инфраструктуру
  104. 104. Сетевые проблемы / Итого Используйте persistent connections Используйте управляемую инфраструктуру
  105. 105. Сетевые проблемы / Итого Используйте persistent connections Не перестарайтесь в борьбе с TIME_WAIT Используйте управляемую инфраструктуру
  106. 106. Человеческий фактор
  107. 107. Распространённость Влияние на производительность Сложность решения Человеческий фактор / Базовая настройка
  108. 108. Человеческий фактор / Базовая настройка %software% performance tuning
  109. 109. Человеческий фактор / Базовая настройка
  110. 110. Распространённость Влияние на производительность Сложность решения Человеческий фактор / Хабраэффект
  111. 111. Человеческий фактор / Хабраэффект Loading...
  112. 112. Распространённость Влияние на производительность Сложность решения Человеческий фактор / Пятничный выкат
  113. 113. Человеческий фактор / Пятничный выкат
  114. 114. Must have
  115. 115. Must have Сбор бэкапов
  116. 116. Must have Сбор бэкапов Мониторинг важных параметров
  117. 117. Must have Хотя бы базовая статистика Сбор бэкапов Мониторинг важных параметров
  118. 118. Must have Хотя бы базовая статистика Сбор бэкапов Грамотный деплой Мониторинг важных параметров
  119. 119. Must have / Наша статистика Хотя бы базовая статистика Сбор бэкапов Грамотный деплой Мониторинг важных параметров
  120. 120. Must have / Наша статистика 6 / 10 Хотя бы базовая статистика Сбор бэкапов Грамотный деплой Мониторинг важных параметров
  121. 121. Must have / Наша статистика 6 / 10 3 / 10 Хотя бы базовая статистика Сбор бэкапов Грамотный деплой Мониторинг важных параметров
  122. 122. Must have / Наша статистика 6 / 10 3 / 10 3 / 10Хотя бы базовая статистика Сбор бэкапов Грамотный деплой Мониторинг важных параметров
  123. 123. Must have / Наша статистика 6 / 10 3 / 10 3 / 10 1 / 20 Хотя бы базовая статистика Сбор бэкапов Грамотный деплой Мониторинг важных параметров
  124. 124. Итого Транзакции Индексы Жадные запросы Внешние запросы cron PHP-сессии HTTP-кешОдинокий apache stateful-код Базы Код Архитектура Сеть Человеческий фактор persistent connections TIME_WAIT rtt Базовая настройка Хабраэффект Пятничный выкат
  125. 125. Наши Docker-проекты github.com/flant/dapp github.com/flant/pam_docker Андрей Половов andrey.polovov@flant.ru Всем спасибо! Наш блог на Хабрахабре habrahabr.ru/company/flant/ Андрей Колаштов andrey.kolashtov@flant.ru
  126. 126. Наш блог на Хабрахабре habrahabr.ru/company/flant/ Тут мы рассказываем о нашем опыте и актуальных технологиях. Подписывайтесь, чтобы быть в курсе!

×