本文轉自:https://www.mgt-commerce.com/blog/magento-on-steroids-best-practice-for-highest-performance/php
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.css
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.html
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.node
In my daily work over some years with magento performance issues i want to share my best practices.mysql
In order to get the best performance we have to care about the server with it’s configuration and magento, our shop software.nginx
Advantages
- 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.web
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.sql
Run all cronjobs on this server. You can also handle all admin users there.apache
Proper 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.session
Setting for the key parameter 「innodb_buffer_pool_size」
Server Type | innodb_buffer_pool_size |
Combined webserver and database server, 6 GB RAM | 2-3 GB |
Dedicated database server, 6 GB RAM | 5 GB |
Dedicated database server, 12 GB RAM | 10 GB |
Dedicated database server, 24 GB RAM | 18 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
MySQLTuner 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.
Linux 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.
By storing dynamic data (var/cache, var/session) on a memory-based filesystem like RAMdisk or tmpfs, the disk I/O is decreased.
The nearest location to your customers means the fastest response.
PHP 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.ini
realpath_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
By 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
NGINX 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.
Test your Site: http://www.gidnetwork.com/tools/gzip-test.php
Configuration 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
KeepAlive 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
Afterwards 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.
It’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.
<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>
Setup Memory-based filesystem for dynamic data (see point 8 above) or use memcached like multi server environment
Multi 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>
Disable not needed extensions in app/etc/modules/*.xml or delete
More Information + Demo |
|
Ioncube is an encoding system for PHP files. Ioncube-encoded files aren’t readable (by humans) so software companies use it to protect their intellectual property. There are many disadvantages with ioncube encrypted extensions. The biggest disadvantage is that it slow down your shop and it’s impossible to extend. Another big problem is that you can’t step into the code with a debugger like xdebug or zend debugger to see what happens.
Willem from http://www.byte.nl wrote a nice article about the ioncube and magento performance.
By default, Magento logs every visitor’s requests to the database. As time goes, the number of records may become enormous and slowing down writes as the table grows.
We often think that the higher the image quality is, the better our blog/site will look. Unfortunately, you are sacrificing a much more important feat – site’s performance! Higher image quality means higher file size. Higher file size means it will take longer and slower to upload/serve that file to a visitor.
Recommended services for image compression
<layout version="0.1.0"> <default> <reference name="right"> <remove name="right.poll"/> </reference> </default> </layout>
More Information + Demo |
|