Тестирование производительности Bitrix Старт на двух принципиально разных платформах. Замерять будем при помощи встроенной панели производительности Bitrix.

C одной стороны, бесплатная версия Proxmox 4.4, LXC контейнеры с использованием файловой системы ZFS на SSD дисках.

С другой стороны, лицензионная Virtuozzo 7 CT + Virtuozzo Storage. В этом варианте мы используем обычные SATA диски + SSD для кеша записи и чтения.

Мы учитываем, что Virtuozzo 7 является коммерческой системой, требующей обязательного лицензирования, а Proxmox 4 можно использовать бесплатно, но без технической поддержки.

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




Цель данного тестирования — измерить производительность сайта Bitrix Старт 16.5.4, установленного внутри контейнеров Proxmox LXC и Virtuozzo 7.

Предыстория

Наша команда занимается сопровождением различных web-проектов.

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

Одной из важных проблем при сопровождении проектов является качество работы хостинга, на котором размещены сайты наших клиентов. Возникают ситуации, когда VPS падает или работает медленно. Бывает, что сервер без видимой причины недоступен или внезапно перезагружен.
В эти моменты мы становимся заложниками службы технической поддержки хостинговой компании и нам приходится тратить время на диагностику проблемы, подготовку статистики и предоставление информации технической поддержке хостинга. Решение подобных проблем иногда длится сутками.

Чтобы исключить для себя эту проблему, мы приняли решение построить небольшой хостинг для наших клиентов. Для этого мы купили сервера и приступили к поиску подходящего дата-центра для их размещения. В качестве площадки мы остановились на Selectel — сервера в их Московском дата-центре работают без перебоев. Техническая поддержка отвечает очень быстро и решает все возникающие вопросы.

Изначально мы выбрали самое просто решение — поднимать сервера на базе Proxmox 3 с контейнерами OpenVZ и рейдом из SSD дисков. Это решение было очень быстрым и достаточно надежным.

Время шло, появился Proxmox 4 и мы постепенно перешли на его использование в сочетании с ZFS. Сразу столкнулись с массой проблем, связанных с LXC. Например, в контейнерах не работал screen и multitail без предварительного запуска exec </dev/tty в контейнере, в Centos 6 без выполнения команды:

sed -i -e 's/start_udev/false/g' /etc/rc.d/rc.sysinit

не работал ssh, не работал pure-ftpd итд. Хорошо все изучив и доработав конфигурацию, мы наладили у себя работу Proxmox и были довольны.

Из плюсов, мы использовали сжатие на уровне ZFS:

  • Это позволяло экономить много дискового пространства для наших пользователей,
  • Решало проблему переполнения файловых систем, например, из-за логов,
  • Исключало проблему, когда база данных mysql с движком innodb не уменьшалась на диске при удалении из нее, а просто заполнялась пустыми блоками,
  • Мы могли перемещать VPS-клиентов в режиме реального времени с сервера на сервер, используя pve-zsync.

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

В какой-то момент стало необходимым задуматься об увеличении производительности виртуальных машин и сайтов наших клиентов.

Мы начали пробовать различные альтернативные варианты. Для тестов мы купили лицензии на Virtuozzo 7 и Cloud Storage. Собрали тестовый кластер Virtuozzo Storage, настроили кеширование и запустили первые тестовые виртуальные машины. На всех этапах нам помогала техническая поддержка Virtuozzo.

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

В качестве первого испытуемого используется Proxmox 4.4-5/c43015a5

Сайты расположены на пуле zfs из 2 SSD дисков в режиме зеркала, через драйвер Proxmox:

zpool create -f -o ashift=12 zroot raidz /dev/sdb3 /dev/sda3                                                                                                                               
zfs set atime=off zroot
zfs set compression=lz4 zroot
zfs set dedup=off zroot
zfs set snapdir=visible zroot
zfs set primarycache=all zroot
zfs set aclinherit=passthrough zroot
zfs inherit acltype zroot

Все остальное для варианта Proxmox полностью стандартно.

Вариант с Virtuozzo 7:

в качестве гипервизора у нас Virtuozzo release 7.0.3 (550), в качестве дискового массива используется Virtuozzo 7 Storage. В качестве MDS используются 3 сервера:

      2 avail      0.0%       1/s   0.0%   100m  17d  6h msk-01:2510
      3 avail      0.0%       0/s   0.0%   102m   5d  1h msk-03:2510
M     1 avail      0.0%       1/s   1.8%    99m  17d  5h msk-06:2510

На тестовом стенде чанки расположены на 2-ух простых SATA дисках

1025 active     869.2G 486.2G     1187        0    29%  1.15/485    1.0 msk-06
1026 active     796.6G 418.8G     1243        0    17%  1.18/440    0.4 msk-06

При этом на каждом чанке есть свои SSD журналы записи, объемом около 166GB

vstorage -c livelinux configure-cs -r /vstorage/livelinux-cs1/data -a /mnt/ssd2/livelinux-cs0-ssd/ -s 170642
vstorage -c livelinux configure-cs -r /vstorage/livelinux-cs2/data -a /mnt/ssd2/livelinux-cs1-ssd/ -s 170642

У клиентов кластера есть локальный кеш на SSD, размером около 370GB

vstorage://livelinux /vstorage/livelinux 
fuse.vstorage _netdev,cache=/mnt/ssd1/client_cache,cachesize=380000 0 0

На тестовом кластере используется режим без репликации, те 1:1. На реальных боевых серверах используется режим 3:2, т.е. все данные одновременно хранятся на 3 серверах кластера, это позволяет избежать потери данных в случае падения до 2 серверов кластера.

Тестовые VPS Bitrix имеют следующие характеристики:

  • CPU 4 ядра
  • RAM 4GB
  • Centos 7
  • Nginx как фронтенд и для отдачи статики
  • Apache 2.4 Prefork для работы .htaccess и реврайтов
  • PHP 5.6 в режиме php-fpm
  • Opcache
  • MariaDB 10.1 база храниться в Innodb
  • Redis для хранения сессий пользователей

Характеристики тестового сервера
Платформа Supermicro SYS-6016T-U
2x Intel Xeon E5620
12 8GB DDR3-1066, ECC, Reg
2x Intel S3510 Series, 800GB, 2.5'' SATA 6Gb/s, MLC
2x Hitachi Ultrastar A7K2000, 1TB, SATA III, 7200rpm, 3.5'', 32MB cache

/etc/sysctl.conf
net.netfilter.nf_conntrack_max=99999999
fs.inotify.max_user_watches=99999999
net.ipv4.tcp_max_tw_buckets=99999999
net.ipv4.tcp_max_tw_buckets_ub=65535
net.ipv4.ip_forward=1
net.ipv4.tcp_syncookies=1
net.ipv4.tcp_max_syn_backlog=65536
net.core.somaxconn=65535
fs.file-max=99999999
kernel.sem=1000 256000 128 1024
vm.dirty_ratio=5
fs.aio-max-nr=262144
kernel.panic=1
net.ipv4.conf.all.rp_filter=1
kernel.sysrq=1
net.ipv4.conf.default.send_redirects=1
net.ipv4.conf.all.send_redirects=0
net.ipv4.ip_dynaddr=1
kernel.msgmn=1024
fs.inotify.max_user_instances=1024
kernel.msgmax=65536
kernel.shmmax=4294967295
kernel.shmall=268435456
kernel.shmmni=4096
net.ipv4.tcp_keepalive_time=15
net.ipv4.tcp_keepalive_intvl=10
net.ipv4.tcp_keepalive_probes=5
net.ipv4.tcp_fin_timeout=30
net.ipv4.tcp_window_scaling=0
net.ipv4.tcp_sack=0
net.ipv4.tcp_timestamps=0
vm.swappiness=10
vm.overcommit_memory=1

nginx -V
nginx version: nginx/1.11.8
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-4) (GCC)
built with OpenSSL 1.0.1e-fips 11 Feb 2013
TLS SNI support enabled
configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic'

/etc/nginx/nginx.conf
worker_processes auto;
timer_resolution 100ms;
pid /run/nginx.pid;
thread_pool default threads=32 max_queue=655360;
events {
worker_connections 10000;
multi_accept on;
use epoll;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$host — $remote_user [$time_local] "$request"' '$status $body_bytes_sent "$http_referer"' '"$http_user_agent" "$http_x_forwarded_for"';
log_format defaultServer '[$time_local][$server_addr] $remote_addr ($http_user_agent) -> "$http_referer" $host "$request" $status';
log_format downloadsLog '[$time_local] $remote_addr "$request"';
log_format Counter '[$time_iso8601] $remote_addr $request_uri?$query_string';
access_log off;
access_log /dev/null main;
error_log /dev/null;

connection_pool_size 256;
client_header_buffer_size 4k;
client_max_body_size 2048m;
large_client_header_buffers 8 32k;
request_pool_size 4k;
output_buffers 1 32k;
postpone_output 1460;
gzip on;
gzip_min_length 1000;
gzip_proxied any;
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript text/x-javascript application/javascript;
gzip_disable «msie6»;
gzip_comp_level 6;
gzip_http_version 1.0;
gzip_vary on;

sendfile on;
aio threads;
directio 10m;
tcp_nopush on;
tcp_nodelay on;
server_tokens off;

keepalive_timeout 75 20;
server_names_hash_bucket_size 128;
server_names_hash_max_size 8192;
ignore_invalid_headers on;
server_name_in_redirect off;

ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.4.4 8.8.8.8 valid=300s;
resolver_timeout 10s;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers 'AES128+EECDH:AES128+EDH';
ssl_session_cache shared:SSL:50m;
ssl_prefer_server_ciphers on;

proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_buffering off;
proxy_buffer_size 8k;
proxy_buffers 8 64k;
proxy_connect_timeout 300m;
proxy_read_timeout 300m;
proxy_send_timeout 300m;
proxy_store off;
proxy_ignore_client_abort on;

fastcgi_read_timeout 300m;
open_file_cache max=200000 inactive=20s;
open_file_cache_valid 30s;
open_file_cache_min_uses 2;
open_file_cache_errors on;

proxy_cache_path /var/cache/nginx/page levels=2 keys_zone=pagecache:100m inactive=1h max_size=10g;

fastcgi_cache_path /var/cache/nginx/fpm levels=2 keys_zone=FPMCACHE:100m inactive=1h max_size=10g;
fastcgi_cache_key "$scheme$request_method$host";
fastcgi_cache_use_stale error timeout invalid_header http_500;
fastcgi_ignore_headers Cache-Control Expires Set-Cookie;

fastcgi_buffers 16 16k;
fastcgi_buffer_size 32k;
upstream memcached_backend { server 127.0.0.1:11211; }

real_ip_header X-Real-IP;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
allow all;
server {
listen 80 reuseport;
}
include /etc/nginx/conf.d/*.conf;
}

/etc/nginx/sites-enabled/start.livelinux.ru.vhost
upstream start.livelinux.ru {
keepalive 10;
server 127.0.0.1:82;
}
server {
listen 80;
server_name start.livelinux.ru www.start.livelinux.ru;
root /var/www/start.livelinux.ru/web;
error_page 404 = @fallback;
location @fallback {
proxy_pass start.livelinux.ru;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
}
error_log /var/log/ispconfig/httpd/start.livelinux.ru/nginx_error.log error;
access_log /var/log/ispconfig/httpd/start.livelinux.ru/nginx_access.log combined;

location ~* ^.+\.(ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|css|rss|atom|js|jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf)$ {
root /var/www/start.livelinux.ru/web;
access_log off;
expires 30d;
}
location ^~ /error { root /var/www; }

location / {
index index.php index.html index.htm;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass start.livelinux.ru;
}
include /etc/nginx/locations.d/*.conf;
}

php -v
PHP 5.6.29 (cli) (built: Dec 9 2016 07:40:09)
Copyright © 1997-2016 The PHP Group
Zend Engine v2.6.0, Copyright © 1998-2016 Zend Technologies
with the ionCube PHP Loader (enabled) + Intrusion Protection from ioncube24.com (unconfigured) v5.1.2, Copyright © 2002-2016, by ionCube Ltd.
with Zend OPcache v7.0.6-dev, Copyright © 1999-2016, by Zend Technologies

/etc/php.ini
[PHP]
engine = On
short_open_tag = On
asp_tags = Off
precision = 14
output_buffering = 4096
zlib.output_compression = Off
implicit_flush = Off
unserialize_callback_func =
serialize_precision = 17
disable_functions =
disable_classes =
realpath_cache_size = 4096k
zend.enable_gc = On
expose_php = off
max_execution_time = 600
max_input_time = 600
max_input_vars = 100000
memory_limit = 512M
error_reporting = E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED
display_errors = Off
display_startup_errors = Off
log_errors = On
log_errors_max_len = 1024
ignore_repeated_errors = Off
ignore_repeated_source = Off
report_memleaks = On
track_errors = Off
html_errors = On
variables_order = «GPCS»
request_order = «GP»
register_argc_argv = Off
auto_globals_jit = On
post_max_size = 500M
auto_prepend_file =
auto_append_file =
default_mimetype = «text/html»
default_charset = «UTF-8»
always_populate_raw_post_data = -1
doc_root =
user_dir =
enable_dl = Off
cgi.fix_pathinfo = 1
file_uploads = On
upload_max_filesize = 500M
max_file_uploads = 200
allow_url_fopen = On
allow_url_include = Off
default_socket_timeout = 60
[CLI Server]
cli_server.color = On
[Date]
date.timezone = Europe/Moscow
[Pdo_mysql]
pdo_mysql.cache_size = 2000
pdo_mysql.default_socket=
[Phar]
[mail function]
sendmail_path = /usr/sbin/sendmail -t -i
mail.add_x_header = On
[SQL]
sql.safe_mode = Off
[ODBC]
odbc.allow_persistent = On
odbc.check_persistent = On
odbc.max_persistent = -1
odbc.max_links = -1
odbc.defaultlrl = 4096
odbc.defaultbinmode = 1
[Interbase]
ibase.allow_persistent = 1
ibase.max_persistent = -1
ibase.max_links = -1
ibase.timestampformat = "%Y-%m-%d %H:%M:%S"
ibase.dateformat = "%Y-%m-%d"
ibase.timeformat = "%H:%M:%S"
[MySQL]
mysql.allow_local_infile = On
mysql.allow_persistent = On
mysql.cache_size = 2000
mysql.max_persistent = -1
mysql.max_links = -1
mysql.default_port =
mysql.default_socket =
mysql.default_host =
mysql.default_user =
mysql.default_password =
mysql.connect_timeout = 60
mysql.trace_mode = Off
[MySQLi]
mysqli.max_persistent = -1
mysqli.allow_persistent = On
mysqli.max_links = -1
mysqli.cache_size = 2000
mysqli.default_port = 3306
mysqli.default_socket =
mysqli.default_host =
mysqli.default_user =
mysqli.default_pw =
mysqli.reconnect = Off
[mysqlnd]
mysqlnd.collect_statistics = On
mysqlnd.collect_memory_statistics = Off
[OCI8]
[PostgreSQL]
pgsql.allow_persistent = On
pgsql.auto_reset_persistent = Off
pgsql.max_persistent = -1
pgsql.max_links = -1
pgsql.ignore_notice = 0
pgsql.log_notice = 0
[Sybase-CT]
sybct.allow_persistent = On
sybct.max_persistent = -1
sybct.max_links = -1
sybct.min_server_severity = 10
sybct.min_client_severity = 10
[bcmath]
bcmath.scale = 0
[Session]
session.save_handler = redis
session.save_path = «tcp://127.0.0.1:6379»
session.use_strict_mode = 0
session.use_cookies = 1
session.use_only_cookies = 1
session.name = SESSIONID
session.auto_start = 0
session.cookie_lifetime = 0
session.cookie_path = /
session.cookie_domain =
session.cookie_httponly =
session.serialize_handler = php
session.gc_probability = 1
session.gc_divisor = 1000
session.gc_maxlifetime = 1440
session.referer_check =
session.cache_limiter = nocache
session.cache_expire = 180
session.use_trans_sid = 0
session.hash_function = 0
session.hash_bits_per_character = 5
url_rewriter.tags = «a=href,area=href,frame=src,input=src,form=fakeentry»
[MSSQL]
mssql.allow_persistent = On
mssql.max_persistent = -1
mssql.max_links = -1
mssql.min_error_severity = 10
mssql.min_message_severity = 10
mssql.compatibility_mode = Off
mssql.secure_connection = Off
[Tidy]
tidy.clean_output = Off
[soap]
soap.wsdl_cache_enabled=1
soap.wsdl_cache_dir="/tmp"
soap.wsdl_cache_ttl=86400
soap.wsdl_cache_limit = 5
[sysvshm]
[ldap]
ldap.max_links = -1

/etc/php.d/10-opcache.ini
zend_extension=opcache.so
opcache.enable=1
opcache.enable_cli=1
opcache.memory_consumption=512
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=130987
opcache.fast_shutdown=1
opcache.blacklist_filename=/etc/php.d/opcache*.blacklist

/etc/php-fpm.d/bitrix.conf
[bitrix]
listen = /var/lib/php5-fpm/web1.sock
listen.owner = web1
listen.group = apache
listen.mode = 0660
user = web1
group = client1
pm = dynamic
pm.max_children = 10
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 5
pm.max_requests = 0
chdir = /
env[HOSTNAME] = $HOSTNAME
env[TMP] = /var/www/clients/client1/web1/tmp
env[TMPDIR] = /var/www/clients/client1/web1/tmp
env[TEMP] = /var/www/clients/client1/web1/tmp
env[PATH] = /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
php_admin_value[open_basedir] = none
php_admin_value[session.save_path] = «tcp://127.0.0.1:6379»
php_admin_value[upload_tmp_dir] = /var/www/clients/client1/web1/tmp
php_admin_value[sendmail_path] = "/usr/sbin/sendmail -t -i -f webmaster@biz.livelinux.ru"
php_admin_value[max_input_vars] = 100000
php_admin_value[mbstring.func_overload] = 2
php_admin_value[mbstring.internal_encoding] = utf-8
php_admin_flag[opcache.revalidate_freq] = off
php_admin_flag[display_errors] = on

httpd -V
Server version: Apache/2.4.6 (CentOS)
Server built: Nov 14 2016 18:04:44
Server's Module Magic Number: 20120211:24
Server loaded: APR 1.4.8, APR-UTIL 1.5.2
Compiled using: APR 1.4.8, APR-UTIL 1.5.2
Architecture: 64-bit
Server MPM: prefork
threaded: no
forked: yes (variable process count)
Server compiled with…
-D APR_HAS_SENDFILE
-D APR_HAS_MMAP
-D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)
-D APR_USE_SYSVSEM_SERIALIZE
-D APR_USE_PTHREAD_SERIALIZE
-D SINGLE_LISTEN_UNSERIALIZED_ACCEPT
-D APR_HAS_OTHER_CHILD
-D AP_HAVE_RELIABLE_PIPED_LOGS
-D DYNAMIC_MODULE_LIMIT=256
-D HTTPD_ROOT="/etc/httpd"
-D SUEXEC_BIN="/usr/sbin/suexec"
-D DEFAULT_PIDLOG="/run/httpd/httpd.pid"
-D DEFAULT_SCOREBOARD=«logs/apache_runtime_status»
-D DEFAULT_ERRORLOG=«logs/error_log»
-D AP_TYPES_CONFIG_FILE=«conf/mime.types»
-D SERVER_CONFIG_FILE=«conf/httpd.conf»

/etc/httpd/conf.modules.d/00-mpm.conf
LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
<IfModule mpm_prefork_module>
StartServers 8
MinSpareServers 5
MaxSpareServers 20
ServerLimit 256
MaxClients 256
MaxRequestsPerChild 4000

/etc/httpd/conf.modules.d/00-mutex.conf
Mutex posixsem
EnableMMAP Off

/etc/httpd/conf.modules.d/10-fcgid.conf
LoadModule fcgid_module modules/mod_fcgid.so
FcgidMaxRequestLen 20000000

/etc/httpd/conf/sites-enabled/100-start.livelinux.ru.vhost
<Directory /var/www/start.livelinux.ru>
AllowOverride None
Require all denied
<//Directory>

<VirtualHost *:82>
DocumentRoot /var/www/clients/client1/web3/web
ServerName start.livelinux.ru
ServerAlias www.start.livelinux.ru
ServerAdmin webmaster@start.livelinux.ru
ErrorLog /var/log/ispconfig/httpd/start.livelinux.ru/error.log

<Directory /var/www/start.livelinux.ru/web>
<FilesMatch ".+\.ph(p[345]?|t|tml)$">
SetHandler None
<//FilesMatch>
Options +FollowSymLinks
AllowOverride All
Require all granted
<//Directory>

<Directory /var/www/clients/client1/web3/web>
<FilesMatch ".+\.ph(p[345]?|t|tml)$">
SetHandler None
<//FilesMatch>
Options +FollowSymLinks
AllowOverride All
Require all granted
<//Directory>

<IfModule mod_suexec.c>
SuexecUserGroup web3 client1
<//IfModule>

<IfModule mod_fastcgi.c>
<Directory /var/www/clients/client1/web3/cgi-bin>
Require all granted
<//Directory>

<Directory /var/www/start.livelinux.ru/web>
<FilesMatch "\.php[345]?$">
SetHandler php5-fcgi
<//FilesMatch>
<//Directory>

<Directory /var/www/clients/client1/web3/web>
<FilesMatch "\.php[345]?$">
SetHandler php5-fcgi
<//FilesMatch>
<//Directory>

Action php5-fcgi /php5-fcgi virtual
Alias /php5-fcgi /var/www/clients/client1/web3/cgi-bin/php5-fcgi-*-82-start.livelinux.ru
FastCgiExternalServer /var/www/clients/client1/web3/cgi-bin/php5-fcgi-*-82-start.livelinux.ru -idle-timeout 300 -socket /var/lib/php5-fpm/web3.sock -pass-header Authorization
<//IfModule>

<IfModule mod_proxy_fcgi.c>
<Directory /var/www/clients/client1/web3/web>
<FilesMatch "\.php[345]?$">
SetHandler «proxy:unix:/var/lib/php5-fpm/web3.sock|fcgi://localhost»
<//FilesMatch>
<//Directory>
<//IfModule>

<IfModule mpm_itk_module>
AssignUserId web3 client1
<//IfModule>

<IfModule mod_dav_fs.c>
<Directory /var/www/clients/client1/web3/webdav>
<ifModule mod_security2.c>
SecRuleRemoveById 960015
SecRuleRemoveById 960032
<//ifModule>

<FilesMatch "\.ph(p3?|tml)$">
SetHandler None
<//FilesMatch>
<//Directory>

DavLockDB /var/www/clients/client1/web3/tmp/DavLock
<//IfModule>
<//VirtualHost>

10.1.20-MariaDB MariaDB Server
symbolic-links=0
default_storage_engine = InnoDB
innodb_file_per_table = 1
innodb_large_prefix = on
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
connect_timeout = 600000
wait_timeout = 28800
max_connections = 800
max_allowed_packet = 512M
max_connect_errors = 10000
net_read_timeout = 600000
connect_timeout = 600000
net_write_timeout = 600000
innodb_open_files = 512
innodb_buffer_pool_size = 2G
innodb_buffer_pool_instances = 4
innodb_file_format = barracuda
innodb_locks_unsafe_for_binlog = 1
innodb_flush_log_at_trx_commit = 2
transaction-isolation = READ-COMMITTED
innodb-data-file-path = ibdata1:10M:autoextend
innodb-log-file-size = 256M
innodb_log_buffer_size = 32M
skip-name-resolve
skip-external-locking
skip-innodb_doublewrite
query_cache_size = 128M
query_cache_type = 1
query_cache_min_res_unit = 2K
join_buffer_size = 8M
sort_buffer_size = 2M
read_rnd_buffer_size = 3M
table_definition_cache = 2048
table_open_cache = 100000
thread_cache_size = 128
tmp_table_size = 200M
max_heap_table_size = 200M
log_warnings = 2
log_error = /var/log/mysql/mysql-error.log
key_buffer_size = 128M
binlog_format=MIXED
server_id = 226
sync-binlog = 0
expire-logs_days = 3
max-binlog-size = 1G
log-slave-updates
binlog-checksum=crc32
slave-skip-errors = 1062,1146
log_slave_updates = 1
slave_type_conversions=ALL_NON_LOSSY
slave-parallel-threads=4
relay-log = /var/log/mysql/mysql-relay-bin
relay-log-index = /var/log/mysql/mysql-relay-bin.index
relay-log-info-file = /var/log/mysql/mysql-relay-log.info
skip-slave-start
optimizer_switch='derived_merge=off,derived_with_keys=off'
sql-mode=""
innodb_flush_method = O_DIRECT_NO_FSYNC
innodb_use_native_aio = 1
innodb_adaptive_hash_index = 0
innodb_adaptive_flushing = 1
innodb_flush_neighbors = 0
innodb_read_io_threads = 16
innodb_write_io_threads = 16
innodb_max_dirty_pages_pct = 90
innodb_max_dirty_pages_pct_lwm = 10
innodb_lru_scan_depth = 4000
innodb_purge_threads = 4
innodb_max_purge_lag_delay = 10000000
innodb_max_purge_lag = 1000000
innodb_checksums = 1
innodb_checksum_algorithm = crc32
table_open_cache_instances = 16
innodb_thread_concurrency = 32
innodb-use-mtflush=ON
innodb-mtflush-threads=8
innodb_use_fallocate=ON
innodb_monitor_enable = '%'
performance_schema=ON
performance_schema_instrument='%sync%=on'
malloc-lib = /usr/lib64/libjemalloc.so.1
port = 3306

/etc/redis.conf
bind 127.0.0.1
protected-mode yes
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 0
pidfile /var/run/redis/redis.pid
loglevel notice
logfile /var/log/redis/redis.log
databases 16
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir /var/lib/redis/
unixsocket /tmp/redis.sock
unixsocketperm 777
slave-serve-stale-data yes
slave-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
slave-priority 100
appendonly no
appendfilename «appendonly.aof»
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
aof-rewrite-incremental-fsync yes
maxmemory 32M
maxmemory-policy volatile-lru

Результаты теста производительности:


Proxmox 4


Virtuozzo 7


В качестве бонуса, Virtuozzo 7, сайт на php70


В качестве итога:

Переход на новую облачную платформу дал нам высокую доступность данных за счет репликации на 3 сервера, но мы потеряли полезную опцию zfs — сжатие. Мы получили прирост производительности тестового сайта на Bitrix, в среднем на 45%. Если говорить о реальных сайтах, то в зависимости от количества плагинов и сложности кода, мы получали прирост до 3 раз.

Из плюсов — мы получили возможность миграции виртуальных машин с сервера на сервер быстро, без необходимости их выключения. Из минусов в отличие от Proxmox, у Virtuozzo 7 пока что нет надежной и удобной панели управления, так что все приходилось делать руками или через shell скрипты. Существующий Automator все еще очень сырой и работает непредсказуемо.

В пользу Virtuozzo — это его техническая поддержка, она на высоте. Также есть хорошая документация по всем компонентам системы, а ведь с этим у Proxmox большие проблемы. Даже чтобы написать на форуме, необходимо оплатить подписку, а на мой взгляд оно того совершенно не стоит. Кластер Proxmox работает пока не сломается, но вот когда сломается, поднять его очень сложно и документации для этого явно не хватает.

Надеюсь, статья окажется для вас полезной. В следущий раз я расскажу о переходе Bitrix на php70 и сравню производительность различных редакций Bitrix.
Поделиться с друзьями
-->

Комментарии (45)


  1. evilbot
    16.01.2017 09:52
    +1

    А это всё в виртуалках или контейнерах? Есть ли сравнение скорости работы Bitrix в виртуальной машине и контейнере?


    1. SyCraft
      16.01.2017 09:59

      Все в контейнерах. Согласно моим тестам, разницы нет.


      1. bbelky
        16.01.2017 18:50
        +1

        Спасибо большое за тестирование — очень интересные результаты!
        Преимущество контейнеров перед ВМ скорее в плотности — ожидается больше инстансов битрикса на один физический сервер. Есть ли у Вас возможность померять именно плотность?


        1. SyCraft
          16.01.2017 18:53

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


  1. Fox_exe
    16.01.2017 11:10

    Похоже на то, что вы в производительность файловой системы уперлись (Толи на уровне драйвера, толи гдето в конфигах самой системы/ядра).
    У меня похожее было — По умолчанию Proxmox пользует LVM, на котором производительность дисков падает в 2-3 раза (Лично у меня). Когда переделал всё на Raw (файлом на ext4 Разделе) — Падение составило около 5% для KVM и около 2% для lxc
    * Тестил на SSD Intel 320 series (180GB)


    1. SyCraft
      16.01.2017 11:13

      Мы использовали ZFS, он не очень быстр увы. Но его плюсы в другом.
      Кстати ZFS рекомендовали сами разработчики Proxmox как самый быстрый вариант работы с диском.


  1. vokinsel
    16.01.2017 11:11

    Proxmox 4.1
    SSD в RAID10

    Виртуалка:
    CPU 2 ядра
    RAM 2GB
    Centos 7
    Nginx как фронтенд и для отдачи статики
    Apache 2.2.15
    PHP 7
    Opcache
    MariaDB
    BitrixEnv

    image

    впервые видел 200 попугаев


    1. SyCraft
      16.01.2017 11:12

      Да, отличный результат показывает php70. А не поделитесь конфигурацией железа и и служб? очень интересно посмотреть на ваш вариант


      1. vokinsel
        16.01.2017 11:42

        Сервер (аренда):
        CPU: Intel® Xeon® CPU E31275 3.40GHz (Cores 8)
        Memory: 32GB ECC
        4 х 240GB SSD (Intel 520 Series) в Software RAID10
        Канал Ethernet в 1Gbps
        рабочая директория в ext3

        настраивал год назад, аптайм 100%.

        Виртуалка:
        KVM
        внутри стандартное окружение BitrixEnv, без тюнинга с моей стороны (кроме БД, немного правил кэш, но это не суть)


  1. lebfr
    16.01.2017 11:24

    Зачем вам такие большие журналы? В рамках сториджа можно считать что чянки у вас маленькие и им столько не требуется.


    1. SyCraft
      16.01.2017 11:25

      У нас осталось по 2 диска SSD на каждой ноде, нужно куда то использовать. Боевой кластер будет увеличиваться, возможно лишним не будет. Так или иначе, других идей для применения этих дисков у меня нет


      1. lebfr
        16.01.2017 11:34

        Ок. Проверяли high availability на базе сториджа? Это когда ВМ с одной ноды переезжает на другую ноду при падении первой.


        1. SyCraft
          16.01.2017 11:42

          Да я понял о чем вы. К сожалению пока что нет. Если често — опасаюсь пока что :)


  1. lebfr
    16.01.2017 11:42

    :)


  1. SergeyD
    16.01.2017 13:36
    +1

    Мы тоже тестировали Proxmox 4 + LXC + ZFS / Loop / Directory (ext4).
    Cравнивали с Proxmox 3.4 + OpenVZ +SimFS (ext4).
    Pезультаты не впечатлили.


    В версии 4.1 было отвратительное проседание производительности до 20% на сопоставимой конфигурации — ФС в директории.
    Причем случайное, т.е. разброс по тестам был 10%.
    Например, пустой контейнер с MySQL сервером на тестах sysbench проседал на 20-25% по сравнению с базовой системой.
    ZFS была адовым тормозом — файловые операции просаживались в 3-4 раза.
    С сжатием и без. Под arc выделяли 4Гб памяти.


    В версии 4.4 починили FileIO — уменьшились задержки, скорость FileIO почти сравнялась с базовой системой.
    Тут ZFS уже не тестировали.
    И MySQL всё так же проседает. Примерно на 15-17%.


    Пробовали на железе: "стандартный" сервер на hezner — EX-40-SSD.
    И сравнивали с Proxmox 3.4 на соседнем EX-40. Без SSD! Что еще больше разачаровало.


    Так что пришлось остаться на Proxmox 3.4. Он хотя бы предсказуемо себя ведет.
    От Virtuozzo пока отталкивает отсутствие web-панели.
    Посмотрим что будет, когда поддержка Wheezy закончится.


    1. lebfr
      16.01.2017 13:53

      WEB панель есть.
      https://virtuozzo.com/products/devops/


      1. SyCraft
        16.01.2017 14:10

        $150 в месяц это за каждый сервер кластера?


      1. SergeyD
        16.01.2017 15:46

        Please contact us for details and the pricing options for larger deployments.

        Вот это раздражает.
        И 150кц в месяц крутовато.


        И как получить тестовую лицензию?
        <ворчун mode on>Там пустое белое поле вылазит при клике на "Get blah-blah", без надписей.
        Что вводить то? Ну кто так делает!<ворчун mode off>


      1. bbelky
        16.01.2017 17:30

        Веб-интерфейс называется Virtuozzo Automator и устанавливается на любой CentOS-based контейнер или виртуальную машину. Описание установки. Это новая сильно обновленная версия (новый дизайн, новая консоль и тд) того, что называлось Parallels Virtual Automation.
        Virtuozzo DevOps — немного другое. Это продукт для создания PaaS или автоматизации DevOps на базе Jelastic.


        1. SyCraft
          16.01.2017 17:31

          К сожалению, работой Automator не доволен. Масса проблем, делают работу с ней практически не возможными.


          1. bbelky
            16.01.2017 18:57

            Да, должен признать, что там пока что довольно много багов. А есть какие-то замечания/предложения по юзабилити и юзкейсам? Может быть какие-то фичи/настройки непонятны или требует доработки?


            1. SyCraft
              16.01.2017 19:05

              На данный момент 2 блокирующих для меня проблемы:
              При миграции виртуальных машин, машина остается в списке слева на исходной ноде в выключенном состоянии, а на новой не появляется. http://screencloud.net/v/lA06

              При любом редактировании сетевых настроек виртуальной машины, они не сохраняются ссылаясь на ошибку. При этом из консоли все работает прекрасно. http://screencloud.net/v/zK6E

              Третий плохой баг, живая миграция так и не заработала, так что мы делаем выключение, миграцию, включение. Это особенно никого не аффектит но тем ни менее…


              1. bbelky
                16.01.2017 19:19

                1) Да, есть такой баг. Обязательно починим в апдейте 1 в середине февраля.
                2) Не встречали — можете описать сценарий подробнее?
                3) Допускаю, что было что-то такое в версиях от начала декабря — сейчас либо починили, либо само исправилось)


                1. SyCraft
                  16.01.2017 19:20

                  Вот он пожалуй один из самых критичных.
                  Кстати вопрос, почему не внедрите lx4 сжатие для данных Cloud Storage?
                  С обывательской точки зрения это должно так же ускорить репликацию и запись данных на чанки, так как их будет просто меньше? А потребители смогут экономить свое пространство массива


                  1. bbelky
                    17.01.2017 11:09

                    Спрошу у storage команды, так как сам мало понимаю, с чем едят lz4;)


                    1. SyCraft
                      17.01.2017 18:04

                      Напишите пожалуйста что скажут. Очень интересно


        1. lebfr
          16.01.2017 17:35

          Мне показалось, что pva переделали в Virtuozzo DevOps. :/ Сам себя обманул. Спасибо.


    1. SyCraft
      16.01.2017 14:08

      У меня аналогичные эмоции :)


      1. SergeyD
        16.01.2017 16:05

        У меня эмоции скорее такие:


        • смогут запилить LXC до уровня OpenVZ или нет?
        • переходить всё равно придется, но какой ценой?

        Поэтому к печали добавляется немного обреченности ?\_(?)_/?


        1. SyCraft
          16.01.2017 16:12

          Кто знает:) мы свой выбор сделали в пользу VZ


        1. Erelecano
          16.01.2017 23:49

          > запилить LXC до уровня OpenVZ

          То есть нужно испортить LXC работу с памятью, сделать падучим и так далее? А может не надо?


          1. avagin
            18.01.2017 04:16

            А вы когда последний раз VZ использовали? Судя по комментарию в то время, когда там были UBC или LSM.


            1. Erelecano
              18.01.2017 18:56

              Старался вспомнить точно, что бы не соврать. Выходит год 2009, после этого я закопал те OpenVZшные тазы, что мне достались и не хочу выкапывать этот ужас летящий на крыльях ночи, ибо есть чудесный LXC который просто работает.


              1. avagin
                19.01.2017 02:59

                Понятие «работает» у всех разное. В случае с OpenVZ доступ к контейнеру можно отдать кому угодно. В случае с LXC этого сделать нельзя, потому что пользователь в контейнере довольно легко может положить всю ноду. Если вам нужен chroot для запуска отдельного окружения, то LXC легко справится с этой задачей. Если вы хотите отдавать доступ к контейнеру в третьи руки, то LXC вам не подходит.

                В 2009 году в LXC работы с памятью просто не было, там и сегодня не все так хорошо. В OpenVZ в то время использовались UBC, которые действительно вызывали много вопросов у пользователей. Сегодня схема работы с памятью совсем другая и она сильно приближена к обычно системе. У контейнера есть два лимита на память и на своп.


                1. Erelecano
                  19.01.2017 17:47

                  Обратите внимание, что я не говорю про LXC в те годы, тогда его просто не было.
                  Но OpenVZ тогда заставил меня закопать ваши контейнеры на ближайшем огороде.

                  Я в профиле видел, что вы — разработчик OpenVZ, я готов вам поверить и даже потестировать для себя, как замену LXC ваши контейнеры, если мне будет возможность использовать дистрибутивное ядро Ubuntu 16.04 с патчами приходящими через canonical-liveptach.

                  Вот на данный момент я использую LXC на личном проекте, где у меня по тазам разведены разные веб-сервисы и отдельно общий мускуль. Я готов и хочу посмотреть можете ли вы мне их заменить. Я получу обновления ядра без ребутов? Я получу изоляцию на том же уровне?


                  1. avagin
                    19.01.2017 19:26

                    Через livepatch можно делать относительно простые изменения, которые не затрагивают изменения структур данных. Да и ядра для убунты нет.
                    Для вашего примера, LXC более чем достаточен. OpenVZ используется, когда действительно нужна изоляция контейнеров друг от друга, когда контейнеры отдаются в третьи руки, а в этом случае базовый дистрибутив играет уже второстепенную роль.


                    1. Erelecano
                      19.01.2017 19:30

                      Спасибо, понял.
                      На самом деле, если вы говорите, что беда с памятью давно изжита, то посмотрю для общего представления, когда будет тестовый полигон. При моей любви к LXC в качестве тазов и к виртуалкам на KVM надо представлять что же ныне дает OpenVZ. Спасибо за ваши пояснения.


    1. SergeyD
      16.01.2017 16:01

      В продолжение печалей:


      На форумах пишут, что есть проблемы с LXC из-за того, что значения в namespace-ах обновляются рекурсивно по каждому чиху, с "нижнего" уровня (контейнер) до базового.
      Все ждут, когда LXC2 в ядре доделают. Обещают избавиться от этого безобразия.


      Если в 4.1 вроде были проблемы с получением лимитированных значений памяти, процессора (htop видел всю память), то в 4.4 это точно починили.


      И ZFS в Linux прикручен с костылями прослойками от Solaris.
      Свой кеш, свое управление памятью. Соотв. эта память отрезается от доступной процессам.
      Сделано интересно, но на рабочем сервере пока запускать страшно.


      1. SyCraft
        16.01.2017 16:03

        Я так же пробовал замерить скорость на KVM виртуальной машине поверх Proxmox и LXC. Результат такой же как и на LXC. Те проблема глобальная для всего продукта


        1. guglez
          16.01.2017 17:59

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


          1. SergeyD
            16.01.2017 18:08

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


          1. SyCraft
            16.01.2017 18:17

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


  1. imhoil
    17.01.2017 11:06

    Уважаемый автор, не покажете cat /proc/cpuinfo на хост-машине proxmox? Производительность в попугаях у битрикс очень сильно зависит от того, в каком режиме работает CPU. Для центос, к примеру, необходимо изменить активный профиль в /etc/tuned/active_profile
    И может быть я открою секрет, но самым важным параметром в количестве попугаев для тестов битрикс является «Среднее время отклика», а он, в свою очередь, очень сильно зависит от частоты, на которой в данный момент работает CPU.
    Не могло оказаться так, что у proxmox cpu работает в режиме «powersave» с пониженной частотой, а Virtuozzo дефолтно использует режим работы «performance»?


    1. SyCraft
      17.01.2017 11:08

      Внутри виртуальной машины следущая картина:

      processor: 3
      vendor_id: GenuineIntel
      cpu family: 6
      model: 44
      model name: Intel® Xeon® CPU E5620 @ 2.40GHz
      stepping: 2
      microcode: 0x15
      cpu MHz: 2401.000
      cache size: 12288 KB
      physical id: 0
      siblings: 8
      core id: 10
      cpu cores: 4
      apicid: 20
      initial apicid: 20
      fpu: yes
      fpu_exception: yes
      cpuid level: 11
      wp: yes
      flags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe
      syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf pni dtes64 monitor ds_cpl
      vmx smx est tm2 ssse3 cx16 xtpr pdcm pcid dca sse4_1 sse4_2 popcnt lahf_lm ida arat epb dtherm tpr_shadow vnmi flexpriority ept vpid
      bogomips: 4799.89
      clflush size: 64
      cache_alignment: 64
      address sizes: 40 bits physical, 48 bits virtual
      power management:


      1. imhoil
        17.01.2017 13:25

        Да, тогда возможно, что заметно влияет и файловая система. Так как, в свое время при тестах, даже изменение попугаев mysql от сотен до тысяч незначительно влияли на итоговую оценку.