Magento on Steroids – Best practice for highest performance

There are plenty of blog posts with tips how to increase the performance of a magento store this shows us how important the speed of a magento store is.

As you may heard google is obsessed with speed, speed is one important factor for their search ranking algorithms. Site speed reflects how fast the website (magento shop) responds to web requests.

The speed of a site is not only important for the shop owners, it’s important for all internet user. Faster sites means happy user, happy customers and more sales. If a magento shop responds slowly, customers leave the website and maybe buy products at your competitor.

 

In my daily work over some years with magento performance issues i want to share my best practices.

In order to get the best performance we have to care about the server with it’s configuration and magento, our shop software.

A) The Server environment – the base for highest performance

  1. Get a dedicated serverAdvantages
    – Whole server power for you
    – You are very flexible in terms of new versions for webserver, database, php …
    – There are not other customers which run “bad” scripts which slow down the shop
    – You don’t share the same ip, very important for SEO.
    If one customer makes a “bad business”, the ip can be blocked by google which affects your search ranking.
    My recommendation:
    I am a big fan of the Amazon EC2 cloud which gives you everything you need (flexibility, scalability, security).
    I installed, configured and optimized more than 100 magento shops around the world, works perfect.
  2. Split database and webserver (if possible)A webserver and a database server have different requirements. A database server needs fast hard disks (e.g. SSD) and much memory and not that much CPU. A webserver needs more CPU and less memory.
  3. Use a separate Backend Server (Multi Server Environment)Run all cronjobs on this server. You can also handle all admin users there.
  4. Use newest MySQL Version
  5. MySQL ConfigurationProper MySQL configuration is one of the most important aspects in terms of performance. Optimizing the MySQL configuration can provide up to 65% performance improvement. MySQL by default is configured to use far fewer resources than the average hardware can accommodate. InnoDB, the primary table storage engine type can use the in-memory buffer pool to cache table indexes and data. Less disk I/O is needed to get data from hard drives when the value of the in-memory buffer pool is set higher. A general recommendation is to set this parameter up to 80% of the available RAM for a dedicated database server. If you are running webserver and database server on one server it’s recommended to split the entire memory pool into two parts.Setting for the key parameter “innodb_buffer_pool_size”
    Server Typeinnodb_buffer_pool_size
    Combined webserver and database server, 6 GB RAM2-3 GB
    Dedicated database server, 6 GB RAM5 GB
    Dedicated database server, 12 GB RAM10 GB
    Dedicated database server, 24 GB RAM18 GB

    Further important MySQL configuration settings

    innodb_thread_concurrency = 2 * [numberofCPUs] + 2
    innodb_flush_log_at_trx_commit = 2
    thread_concurrency = [number of CPUs] * 3
    thread_cache_size = 32
    table_cache = 1024
    query_cache_size = 64M
    query_cache_limit = 2M
    join_buffer_size = 8M
    tmp_table_size = 256M
    key_buffer = 32M
    innodb_autoextend_increment=512
    max_allowed_packet = 16M
    max_heap_table_size = 256M
    read_buffer_size = 2M
    read_rnd_buffer_size = 16M
    bulk_insert_buffer_size = 64M
    myisam_sort_buffer_size = 128M
    myisam_max_sort_file_size = 10G
    myisam_max_extra_sort_file_size = 10G
    myisam_repair_threads = 1

  6. Checkout MySQLTunerMySQLTuner is a Perl script that allows you to review a MySQL installation quickly and make adjustments to increase performance and stability. The current configuration variables and status data is retrieved and presented in a brief format along with some basic performance suggestions.
  7. Mount disk with noatime optionLinux has a special mount option for file systems called noatime. If this option is set for a file system in /etc/fstab, then reading accesses will no longer cause the atime information (last access time – don’t mix this up with the last modified time – if a file is changed, the modification date will still be set) that is associated with a file to be updated (in reverse this means that if noatime is not set, each read access will also result in a write operation). Therefore, using noatime can lead to significant performance gains.
  8. Memory-based filesystem for dynamic dataBy storing dynamic data (var/cache, var/session) on a memory-based filesystem like RAMdisk or tmpfs, the disk I/O is decreased.
  9. Host the shop in same country where your customers areThe nearest location to your customers means the fastest response.
  10. Install the newest PHP VersionPHP 5.2.x is very old and slow. PHP 5.3.x is about 30-40% faster than PHP 5.2.x and has a lower memory footprint. PHP 5.4.x is about 20% than PHP 5.3.x for magento.Some key parameter for your php.inirealpath_cache_size = 32k
    realpath_cache_ttl = 7200
    max_execution_time = 90
    max_input_time = 90
    memory_limit = 256M
    default_socket_timeout = 90
    pdo_mysql.cache_size = 2000
    output_buffering = 4096
  11. Install a byte code cache like APCBy default, Magento saves it’s cache data in file system. This is fine for small sites with low traffic, but as you get more and more requests, reading and writing to the file system become slower from time to time. With APC you will not have such problems because all valus are stored in memory.Example php.ini configuration
    apc.enabled = 1
    apc.optimization  = 0
    apc.shm_segments = 1
    apc.shm_size = 768M
    apc.ttl = 48000
    apc.user_ttl  = 48000
    apc.num_files_hint = 8096
    apc.user_entries_hint = 8096
    apc.mmap_file_mask = /tmp/apc.XXXXXX
    apc.enable_cli = 1
    apc.cache_by_default  = 1
    apc.max_file_size = 10M
    apc.include_once_override = 0
  12. Swap Apache for NGINXNGINX is a high performance, high concurrency edge web server with the key features to build modern, efficient, accelerated web infrastructure.
    In one of my previous project (biggest e-commerce site in brasil) with 750.000 unique visitors / day we swapped 6 apache webserver with 2 nginx webserver and we had a load of 1.00 afterwards.
  13. Enable Gzip Compression in NGINX configuration or Apache .htaccessTest your Site: http://www.gidnetwork.com/tools/gzip-test.php
  14. Set expiration header for static filesConfiguration for nginx vhost:
    location ~* ^.+\.(css|js|jpg|jpeg|gif|png|ico|gz|svg|svgz|ttf|otf|woff|eot|mp4|ogg|ogv|webm)$ {
    expires max;
    access_log off;
    }
    Apache:
    Make sure the module “mod_expire” is enabled
  15. Apache modules – use just necessary modules
  16. Apache: Eliminating directory structure scans for the .htaccess
  17. Enable KeepAliveKeepAlive provides long-lived HTTP sessions which allow multiple requests to be sent over the same TCP connection. In some cases this has been shown to result in an almost 50% speedup in latency times for HTML documents with many images.NGINX: http://wiki.nginx.org/HttpCoreModule#keepalive_timeout (Default is 75 seconds, which is good)
    Apache: http://httpd.apache.org/docs/current/misc/perf-tuning.html
  18. Use a Content Delivery Network (CDN) for delivering static files like js, css and images to offload your serverAfterwards your server has only php request to handle this means all requests for js, css and images are handled by the CDN. You may save a lot of hosting costs.
    My personal experience
    I made very good experience with Amazon Cloufront because it’s very easy to integrate and not expensive and fully integrated in the Amazon Webservice. In my previous posts i wrote about how to use magento with Cloudfront.
  19. Uninstall xdebug or zend debugger on productionIt’s a perfect tool for a development or testing environment but not for production. In some of our projects xdebug had a performance impact of 10-15%, especially with high traffic.

B) Magento configuration

  1. Single Server Environment:
    Use APC as magento cache storage (app/etc/local.xml)

          <global>
            ...
             <cache>
                <backend>apc</backend>
                <prefix>mgt_</prefix>
             </cache>
            ...
            </global>

    Multi Server Environment
    Use memcached as central cache storage

    <global>
    ...
    <cache>
      <backend>memcached</backend><!-- apc / memcached / empty=file -->
      <memcached><!-- memcached cache backend related config -->
        <servers><!-- any number of server nodes can be included -->
          <server>
            <host><![CDATA[127.0.0.1]]></host>
            <port><![CDATA[11211]]></port>
            <persistent><![CDATA[1]]></persistent>
            </server>
        </servers>
        <compression><![CDATA[0]]></compression>
        <cache_dir><![CDATA[]]></cache_dir>
        <hashed_directory_level><![CDATA[]]></hashed_directory_level>
        <hashed_directory_umask><![CDATA[]]></hashed_directory_umask>
        <file_name_prefix><![CDATA[]]></file_name_prefix>
      </memcached>
    </cache>
    ...
    </global>
  2. Store sessions in memory
    Single Server Environment:Setup Memory-based filesystem for dynamic data (see point 8 above) or use memcached like multi server environmentMulti Server Environment

    <global>
    ...
    <session_save><![CDATA[memcache]]></session_save>
    <session_save_path><![CDATA[tcp://127.0.0.1:11211?persistent=0&weight=1&timeout=1&retry_interval=15]]></session_save_path>
    <session_cache_limiter><![CDATA[]]></session_cache_limiter>
    ...
    </global>
  3. Uninstall any extensions that you don’t actually use.Disable not needed extensions in app/etc/modules/*.xml or delete
  4. Enable all Magento Caches: System -> Cache Management.
    Magento Cache Storage Management
  5. Enable “Use Flat Catalog Category” and “Use Flat Catalog Product” to decrease database queries: System -> Configuration -> Catalog -> Catalog -> Frontend
    Magento Use Flat Catalog Category / Product
  6. Enable “Merge JavaScript Files” and “Merge CSS Files” to reduce the number of http requests
    Magento Merge Js and Css Files

Leave a Reply

Your email address will not be published. Required fields are marked *

*