Производительность Bitrix Старт на Proxmox и Virtuozzo 7 & Virtuozzo Storage


    Тестирование производительности 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.
    Share post

    Comments 45

      +1
      А это всё в виртуалках или контейнерах? Есть ли сравнение скорости работы Bitrix в виртуальной машине и контейнере?
        0
        Все в контейнерах. Согласно моим тестам, разницы нет.
          +1
          Спасибо большое за тестирование — очень интересные результаты!
          Преимущество контейнеров перед ВМ скорее в плотности — ожидается больше инстансов битрикса на один физический сервер. Есть ли у Вас возможность померять именно плотность?
            0
            К сожалению мы не размещаем клиентов очень плотно друг к другу. Это главная суть нашей работы сейчас, давать максимально комфортные условия для наших клиентов. Но на тестовом окружении будем пробовать. Буду стараться написать об этом в одной из следующих статей.
        0
        Похоже на то, что вы в производительность файловой системы уперлись (Толи на уровне драйвера, толи гдето в конфигах самой системы/ядра).
        У меня похожее было — По умолчанию Proxmox пользует LVM, на котором производительность дисков падает в 2-3 раза (Лично у меня). Когда переделал всё на Raw (файлом на ext4 Разделе) — Падение составило около 5% для KVM и около 2% для lxc
        * Тестил на SSD Intel 320 series (180GB)
          0
          Мы использовали ZFS, он не очень быстр увы. Но его плюсы в другом.
          Кстати ZFS рекомендовали сами разработчики Proxmox как самый быстрый вариант работы с диском.
          0
          Proxmox 4.1
          SSD в RAID10

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

          image

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

            0
            Да, отличный результат показывает php70. А не поделитесь конфигурацией железа и и служб? очень интересно посмотреть на ваш вариант
              0
              Сервер (аренда):
              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, без тюнинга с моей стороны (кроме БД, немного правил кэш, но это не суть)
            0

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

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

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

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

              :)

                +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 закончится.

                  0
                  WEB панель есть.
                  https://virtuozzo.com/products/devops/
                    0
                    $150 в месяц это за каждый сервер кластера?
                      0
                      Please contact us for details and the pricing options for larger deployments.

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


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

                        0
                        Веб-интерфейс называется Virtuozzo Automator и устанавливается на любой CentOS-based контейнер или виртуальную машину. Описание установки. Это новая сильно обновленная версия (новый дизайн, новая консоль и тд) того, что называлось Parallels Virtual Automation.
                        Virtuozzo DevOps — немного другое. Это продукт для создания PaaS или автоматизации DevOps на базе Jelastic.
                          0
                          К сожалению, работой Automator не доволен. Масса проблем, делают работу с ней практически не возможными.
                            0
                            Да, должен признать, что там пока что довольно много багов. А есть какие-то замечания/предложения по юзабилити и юзкейсам? Может быть какие-то фичи/настройки непонятны или требует доработки?
                              0
                              На данный момент 2 блокирующих для меня проблемы:
                              При миграции виртуальных машин, машина остается в списке слева на исходной ноде в выключенном состоянии, а на новой не появляется. http://screencloud.net/v/lA06

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

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

                                0
                                1) Да, есть такой баг. Обязательно починим в апдейте 1 в середине февраля.
                                2) Не встречали — можете описать сценарий подробнее?
                                3) Допускаю, что было что-то такое в версиях от начала декабря — сейчас либо починили, либо само исправилось)
                                  0
                                  Вот он пожалуй один из самых критичных.
                                  Кстати вопрос, почему не внедрите lx4 сжатие для данных Cloud Storage?
                                  С обывательской точки зрения это должно так же ускорить репликацию и запись данных на чанки, так как их будет просто меньше? А потребители смогут экономить свое пространство массива
                                    0
                                    Спрошу у storage команды, так как сам мало понимаю, с чем едят lz4;)
                                      0
                                      Напишите пожалуйста что скажут. Очень интересно
                            0
                            Мне показалось, что pva переделали в Virtuozzo DevOps. :/ Сам себя обманул. Спасибо.
                          0
                          У меня аналогичные эмоции :)
                            0

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


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

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

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

                                То есть нужно испортить LXC работу с памятью, сделать падучим и так далее? А может не надо?
                                  0
                                  А вы когда последний раз VZ использовали? Судя по комментарию в то время, когда там были UBC или LSM.
                                    0
                                    Старался вспомнить точно, что бы не соврать. Выходит год 2009, после этого я закопал те OpenVZшные тазы, что мне достались и не хочу выкапывать этот ужас летящий на крыльях ночи, ибо есть чудесный LXC который просто работает.
                                      0
                                      Понятие «работает» у всех разное. В случае с OpenVZ доступ к контейнеру можно отдать кому угодно. В случае с LXC этого сделать нельзя, потому что пользователь в контейнере довольно легко может положить всю ноду. Если вам нужен chroot для запуска отдельного окружения, то LXC легко справится с этой задачей. Если вы хотите отдавать доступ к контейнеру в третьи руки, то LXC вам не подходит.

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

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

                                        Вот на данный момент я использую LXC на личном проекте, где у меня по тазам разведены разные веб-сервисы и отдельно общий мускуль. Я готов и хочу посмотреть можете ли вы мне их заменить. Я получу обновления ядра без ребутов? Я получу изоляцию на том же уровне?
                                          0
                                          Через livepatch можно делать относительно простые изменения, которые не затрагивают изменения структур данных. Да и ядра для убунты нет.
                                          Для вашего примера, LXC более чем достаточен. OpenVZ используется, когда действительно нужна изоляция контейнеров друг от друга, когда контейнеры отдаются в третьи руки, а в этом случае базовый дистрибутив играет уже второстепенную роль.
                                            0
                                            Спасибо, понял.
                                            На самом деле, если вы говорите, что беда с памятью давно изжита, то посмотрю для общего представления, когда будет тестовый полигон. При моей любви к LXC в качестве тазов и к виртуалкам на KVM надо представлять что же ныне дает OpenVZ. Спасибо за ваши пояснения.
                              0

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


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


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


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

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

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

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

                                  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:
                                    0
                                    Да, тогда возможно, что заметно влияет и файловая система. Так как, в свое время при тестах, даже изменение попугаев mysql от сотен до тысяч незначительно влияли на итоговую оценку.

                                Only users with full accounts can post comments. Log in, please.