Настройка-оптимизация VPS сервера

Печать RSS
503

Автор
Последний из могикан
+1
Любой сервер нуждается в оптимизации под нагрузки, и настройки нового сервера обычно по умолчанию, но не выдерживают даже малейших нагрузок.
Например у меня, при 4 ядрах процессора и 8 Гб оперативки, даже от малого трафика и запросов по крону, уходило в ошибку по тайм-ауту и нагружало процессор до 90-100%.
Решил сделать немного оптимизации. Первым делом включаем кеш Redis, как самый оптимальный. Затем настраиваем Opcache, nginx, php-fpm и кеширование mysql. Все примеры под мою конфигурацию.

В backend так (пулы и opcache):
pm = ondemand
pm.max_children = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 2
pm.max_requests = 1000

php_admin_value[date.timezone] = "Europe/Moscow"
php_admin_value[display_errors] = "off"
php_admin_value[log_errors] = "On"
php_admin_value[mail.add_x_header] = "On"
php_admin_value[max_execution_time] = "600"
php_admin_value[max_input_vars] = "10000"
php_admin_value[opcache.blacklist_filename] = "/opt/opcache-blacklists/opcache-*.blacklist"
php_admin_value[opcache.max_accelerated_files] = "300000"
php_admin_value[memory_limit] = "2048M"
php_admin_value[opcache.enable_cli] = "0"
php_admin_value[opcache.interned_strings_buffer] = "512M"
php_admin_value[opcache.memory_consumption] = "1024M"
php_admin_value[output_buffering] = "4096"
php_admin_value[post_max_size] = "100M"

Изменения в Nginx Config
/etc/nginx/nginx.conf

в http{..} секцию

http {
	#...
        fastcgi_read_timeout 600; 
	#...
}
Изменил: GodZiLLa
Автор
Последний из могикан
0
Кеширование в MySql

VDS с 8 ГБ RAM, SSD
# Память
innodb_buffer_pool_size = 5G
innodb_buffer_pool_instances = 2

# Флаш и I/O
innodb_flush_method = O_DIRECT
innodb_io_capacity = 2000
innodb_io_capacity_max = 6000
innodb_flush_neighbors = 0
innodb_adaptive_flushing = 1
innodb_lru_scan_depth = 2048
Вроде всё, что вспомнил по настройкам, если что вспомню дополнительно, добавлю.

По результату, нагрузка на процессор уменьшилась, работа в озу увеличилась из-за кеша, но уже стало работать бодрее и в основном пропала ошибка по тайм-ауту при запросах на сайты, но не до конца.
По крону, есть некоторые тяжёлые запросы, если на бегете отрабатывают без проблем, то на моём vps вылетает такой запрос в ошибку A timeout occurred Error code 524
И хотя лимит выставлен на 600 секунд, то есть 10 минут, а сам запрос занимает 2-3 минуты, то всё равно ошибка по лимиту тайм-аута.

Вот и не пойму, где то ещё есть чего настроить ?
А

Чатланин
0
GodZiLLa, а в логах что пишет? Там ведь инфо должно быть, что за проблема. Также если VPS у тебя в локации РФ, то CF замедляются все запросы out/in от него. Это особенно касается облаков, которые подключены к ТСПУ.
попробуй крон запускать не через NGINX/APACHE/CURL. Т.е. не по http. Только придется полные пути (от home) в файле скрипта прописывать (например к БД). Ну и в крон /usr/local/bin/php -q /home/admin/site.com/cron.php
Из терминала попробуй сначала запустить из командной строки. Какие у тебя пути к php, не знаю.
Подключение к БД тоже через 127.0.0.1 или localhost.
Изменил: Александр
Автор
Последний из могикан
0
Александр, d логах вообще по этой проблеме ничего, нет ошибок.
А сам файл для крона, не подразумевает другого способа запуска, только по https.
Да и на простом хостинге бегета этот запуск отрабатывает без проблем, а на сервере нет.
Нужно искать, где то ещё по таймауту ограничение видимо, а где, не понятно, вроде везде выправил.
W

Землянин
+1
при 4 ядрах процессора и 8 Гб оперативки
чёто на богатом =D
что у тебя за проект что положило такой конфиг?
Автор
Последний из могикан
0
чёто на богатом =D
что у тебя за проект что положило такой конфиг?
@WapStyle Сегодня / 18:26
Три сайта со специфическим контентом )
Но не про это, а то, что запрос к скрипту больше двух минут не проходит.
Нужно больше информации, где на vps можно ещё настроить тайм-аут, кроме указанных в самом начале )

Пацак
0
524 выдаёт не сервер, а браузер, когда не успевает получить ответ за требуемое время.
Нужно определить какую нагрузку даёт скрипт запускаемый через cron, и ограничить (понизить приоритет этих процессов) эту нагрузку (nice для cpu, ionice для дисков)

и ещё обрати внимание на настройки fpm, это для тестовых серверов пойдёт, для продакшена точно нет, и сейчас объясню почему:
; запускает процессы только по требованию, в продакшене принято performance, оно держит какое-то кол-во процессов всегда готовыми. Но это можно не менять
pm = ondemand
; Этим ты ограничиваешь кол-во процессов до 2, если один занят (скриптом крона, например), отработает второй, но и он может оказаться занят, и вот тогда будут 503 и 524. Посмотри сколько оперативы занимает один процесс, и сделай их штук 5 хотя-бы, лучше 10 (отталкиваясь от оперативы)
pm.max_children = 2
; тут ты устанавливаешь минимум 1 свободный процесс и максимум 2. Я бы сделал 2 и 3, что-бы хотя-бы один всегда был готов принять запрос и не дабавлял доп.время на его старт
pm.min_spare_servers = 1
pm.max_spare_servers = 2
; этим ты перезапускаешь каждый процесс после 1000 запросов к нему, тут норм.
pm.max_requests = 1000
pm.max_children точно стоит увеличить, это образует затык, если оба процесса заняты - все запросы будут ждать их освобождения, что ты и наблюдаешь в виде ошибки 524
При минимальных размерах RAM я делаю следующие настройки (для тех же тестовых серверов)
pm.start_servers = 1 ; * 50MB = Min RAM
pm.max_children = 5 ; * 50MB = Max RAM
pm.min_spare_servers = 1
pm.max_spare_servers = 3
Изменил: /7o/loTeH4I1k

Пацак
0
Совсем забыл, вместо
pm = ondemand
лучше сделать
pm = dynamic
. Это что-то между ondemand и static.
В ondemand на сколько я помню свободные процессы вообще не содержатся, каждый раз тратится время на старт процесса, но и оператива не расходуется попусту.
В static всегда нужное кол-во процессов висит и ждёт запросов, максимально быстро приступают к их обработке, но все они занимают место в оперативной памяти.

Ну и dynamic держит некоторое кол-во процессов в запасе что-бы запуск процессов для новых запросов был менее заметен на времени отклика
Изменил: /7o/loTeH4I1k
Автор
Последний из могикан
0
/7o/loTeH4I1k, если ограничить работу скрипта, выполняемого через крон, то он не будет толком выполняться, как и сейчас делает, из-за ошибки по тайм-ауту. И странно, на бегете, на простом хосте, этот же запрос без проблем выполняется, а здесь на vps, что только ни делал, более 2х минут не работает, а надо хотя бы 3-4 минуты и он отработает. Запрос конечно тяжёлый, спасибо Дознету ). Оптимизации никакой ).

А настройки, какие только ни делал, не помогает. Сейчас уже так:
pm = dynamic
pm.max_children = 36
;pm.process_idle_timeout = 300s
pm.start_servers = 12
pm.min_spare_servers = 8
pm.max_spare_servers = 24
pm.max_requests = 1000
Пробовал и dynamic, и ondemand, ситуация не меняется. Где то стоит ограничение на две минуты.
Нашёл в одном месте, /etc/nginx/conf.d, там в одном файле есть такие настройки
proxy_read_timeout 120s;
    proxy_connect_timeout 120s;
    proxy_buffer_size   128k;
    proxy_buffers   4 256k;
    proxy_busy_buffers_size   256k;
    client_body_timeout   120s;
    send_timeout  120s;
Как раз по две минуты ограничение, но исправить не даёт.
Вот это
pm.process_idle_timeout = 300s
делал на ondemand, так как рекомендуют эту строку вместо этих
pm.start_servers = 12
pm.min_spare_servers = 8
pm.max_spare_servers = 24
Хотя делал по разному, и вместе, и по очереди, результат один и тот же.

Пацак
0
GodZiLLa, в php.ini нет ограничения? Я был уверен, что дело в pm.max_spare_servers и нехватке свободных процессов
GodZiLLa, а что значит "исправить не даёт" в nginx? Возможно последние две директивы и ограничивают, остальные по идее только на проксированные запросы должны действовать
Стикеры / Теги / Правила