[转]How to speed up Magento 2. Maximum Performance
本文转自:https://magedirect.co/how-to-speed-up-magento-2-maximum-performance/
Introduction
In this article, we’ll show you how to run a Magento 2 store at maximum speed. We will review the most popular techniques that you can quickly implement today.
So, let’s imagine the situation:
- You are preparing for big sales and the development team is making final edits in the code.
 - You are not happy with the current performance of your store on Magento 2 and want to finally get it over with, and to speed up it.
 - You have many products and categories, and the store is slow
 
If you find your situation with this line, then read on.
1. Preliminary preparation of the test store
Let’s create a real situation, and simulate a large store with a huge amount of products.
Thanks to the Magento 2 developers, they took care of the fact that we were able to generate a set of test products. To do this, Magento 2 has a data generator that allows you to generate a large amount of data (products, websites, categories, customers, order, etc)
More detailed instructions can be found in the official documentation:
http://devdocs.magento.com/guides/v2.2/config-guide/cli/config-cli-subcommands-perf-data.html
So we begin the fun:
Install the fresh Magento 2 on the server and load the test data into the Magento.
In this example, we will use one server for the application and the database.
We use dedicated server – DELL PowerEdge ™ R730 DX151 with the following characteristics:
CPU(s): 16
Model name: Intel(R) Xeon(R) CPU E5-2620 v4 @ 2.10GHz
CPU MHz: 1200.281
L3 cache: 20480K
Memory: 64 GB
For speeding up the highload store, we will install the following software which is recommended by Magento Team:
- Mysql
 - Nginx
 - php7-fpm
 - Redis
 - Varnish
 
Next, we will configure Cache Settings:
We will use the Varnish as Caching Application
Let’s enable Varnish in Magento 2 admin panel
Stores -> Configuration -> Advanced -> System -> Full Page Cache and select next settings:

Then we will enable Redis as default cache (default array) and the full page cache.
For default settings add next records in your app/etc/env.php
PHP
| 
 1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 
31 
32 
33 
34 
35 
36 
37 
38 
39 
40 
41 
42 
43 
44 
45 
46 
47 
48 
49 
50 
51 
52 
53 
54 
55 
56 
57 
58 
59 
60 
61 
62 
63 
64 
65 
66 
67 
68 
69 
70 
71 
72 
73 
74 
75 
76 
77 
78 
79 
80 
81 
82 
83 
84 
85 
 | 
  array ( 
   'frontend' => 
   array ( 
     'default' => 
     array ( 
       'backend' => 'Cm_Cache_Backend_Redis', 
       'backend_options' => 
       array ( 
         'server' => '127.0.0.1', 
         'port' => '6379', 
         'persistent' => '', 
         'database' => '0', 
         'force_standalone' => '0', 
         'connect_retries' => '1', 
         'read_timeout' => '10', 
         'automatic_cleaning_factor' => '0', 
         'compress_data' => '1', 
         'compress_tags' => '1', 
         'compress_threshold' => '20480', 
         'compression_lib' => 'gzip', 
       ), 
     ), 
     'page_cache' => 
     array ( 
       'backend' => 'Cm_Cache_Backend_Redis', 
       'backend_options' => 
       array ( 
         'server' => '127.0.0.1', 
         'port' => '6379', 
         'persistent' => '', 
         'database' => '1', 
         'force_standalone' => '0', 
         'connect_retries' => '1', 
         'read_timeout' => '10', 
         'automatic_cleaning_factor' => '0', 
         'compress_data' => '0', 
         'compress_tags' => '1', 
         'compress_threshold' => '20480', 
         'compression_lib' => 'gzip', 
       ), 
     ), 
   ), 
 ), 
 | 
2. Generate test data for our store
We will use generated data from Magento 2. More details you can find here:
http://devdocs.magento.com/guides/v2.2/config-guide/cli/config-cli-subcommands-perf-data.html
We use so-called “Large profile”
It is:
| Name | Value | 
| website | 5 | 
| store group | 5 | 
| store views | 5 | 
| simple products | 300,000 | 
| configurable_products | 8,000 with 24 options | 
| categories | 3000 | 
| categories_nesting_level | 5 | 
| catalog_price_rules | 20 | 
| catalog_target_rules | 5 | 
| cart_price_rules | 20 | 
| cart_price_rules_floor | 2 | 
| customers | 5000 | 
| tax rates | 40,000 | 
| orders | 100,000 | 
Start the generation with the command:
Shell
| 
 1 
 | 
 bin/magento setup:perf:generate-fixtures /var/www/html/magento2/setup/performance-toolkit/profiles/ce/large.xml 
 | 
The execution of this script takes time. If you do a similar job, we advise you to set enough memory for PHP or only personally to the given script with the help of the directive “memory_limit”. For example:
Shell
| 
 1 
 | 
 php -d="memory_limit=-1" setup:perf:generate-fixtures /var/www/html/magento2/setup/performance-toolkit/profiles/ce/large.xml 
 | 
In this example, we set up unlimited memory for php processes.
After the script is executed in our store, we load all the test data we need to check the performance. Let’s open some test category.

Cool! The store is filled with test data. Check the administrative panel.
Products:

Orders:

A lot of categories:

Customers:

3. Let’s setup Magento for high-load
Now we will show you the most priority and simplest actions to speed up your store and to turn into a high-performance mode.
Step 1. Enable production mode
Let’s enable Magento 2 in the combat mode so that your Magento works in high-efficiency mode. For this, you need to enable production mode.
Magento 2 has different modes:
- default
 - developer
 - production
More details about modes you can check here: http://devdocs.magento.com/guides/v2.0/config-guide/bootstrap/magento-modes.html
 
Run the following command:
Shell
| 
 1 
 | 
 magento deploy:mode:set production 
 | 
Check:
Shell
| 
 1 
 | 
 magento deploy:mode:show 
 | 
You should see the next output:
Current application mode: production. (Note: Environment variables may override this value.)
Then run the command
Shell
| 
 1 
 | 
 php bin/magento setup:di:compile 
 | 
This will then re-compile the files. Lastly:
Shell
| 
 1 
 | 
 php bin/magento setup:static-content:deploy 
 | 
If Magento has enabled maintenance mode – disable maintenance mode by the command:
Shell
| 
 1 
 | 
 ./bin/magento maintenance:disable 
 | 
Step 2. Enable Cache
We enable all cache types in the administrative panel in the section System -> Cache Management

Step 3. Flat Catalog
Let’s Enable Flat Catalog. With this setting, Magento 2 will make less complex MySQL queries in the database.

Don’t forget to clear configuration cache after this action.
Step 4. Merge & Minify CSS and JS Files
Further, we include the minification and Merge in Store -> Configuration -> Developer
Enable Merge CSS and JS Files, Minify CSS & JS. It will speed up the loading of CSS and JS


Step 5. Tune Server Configuration
Let’s show the most needed configurations for a store with a high load:
Mysql (config file: my.cnf)
The max_allowed_packet directive is chosen empirically to avoid the error “General error: 2006 MySQL server has gone away”. By studying the MySQL logs, you will be able to determine what size of packages your database needs.
For this amount of data we will use:
PHP
| 
 1 
 | 
 max_allowed_packet = 32M 
 | 
The directives tmp_table_size and max_heap_table_size are chosen experimentally. With the default value of Magento, many temporary tables will be created. It is defined using the command:
Shell
| 
 1 
 | 
 show global status LIKE 'Created_tmp_disk_tables'; 
 | 
For this demo store we use:
Shell
| 
 1 
2 
 | 
 tmp_table_size = 128M 
max_heap_table_size = 128M 
 | 
The innodb_buffer_pool_size directive is set relative to the amount of RAM. The recommended value is 70-80%.
For our server this value is:
Shell
| 
 1 
 | 
 innodb_buffer_pool_size = 48G 
 | 
PHP (config file .php.ini)
The RAM limit must be at least 1G
Shell
| 
 1 
 | 
 memory_limit=1G 
 | 
For cron jobs we personally set at least 4GB
Shell
| 
 1 
2 
3 
4 
5 
 | 
 * * * * * /usr/bin/php -d=”memory_limit=”4000M” /var/www/magento2/bin/magento cron:run | grep -v "Ran jobs by schedule" >> /var/www/magento2/var/log/magento.cron.log 
* * * * * /usr/bin/php -d=”memory_limit=”4000M /var/www/magento2/update/cron.php >> /var/www/magento2/var/log/update.cron.log 
* * * * * /usr/bin/php -d=”memory_limit=”4000M /var/www/magento2/bin/magento setup:cron:run >> /var/www/magento2/var/log/setup.cron.log 
 | 
Note:
– Reindex requires more RAM on so many products, if 4GB is not enough for you – try using the bigger value.
– reindex on so many products is performed for a long time, so it’s better to set the reindex mode “update on save”

Step 6. Enable Gzip Compression
Turn on gzip compression in the nginx config:
Shell
| 
 1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
 | 
 gzip on; 
gzip_disable "msie6"; 
gzip_comp_level 6; 
gzip_min_length 1100; 
gzip_buffers 16 8k; 
gzip_proxied any; 
gzip_types 
    text/plain 
    text/css 
    text/js 
    text/xml 
    text/javascript 
    application/javascript 
    application/x-javascript 
    application/json 
    application/xml 
    application/xml+rss 
    image/svg+xml; 
gzip_vary on; 
 | 
Step 7. Optimize Images.
There are different strategies for optimizing images. You can use third-party extensions or optimize before upload images to Magento. In this article, we use a simple script that uses open-source Linux libraries.
Just install next software:
Shell
| 
 1 
2 
3 
 | 
 apt-get install optipng 
apt-get install jpegoptim 
apt-get install gifsicle 
 | 
Shell
| 
 1 
2 
3 
4 
5 
6 
7 
 | 
 #!/bin/bash 
find ./media -iname '*.gif' -exec sh -c 'gifsicle -b -O3 -o "{}.out" "{}"; mv "{}.out" "{}"' \; 
find ./media -iname '*.png' -exec optipng -o5 -keep -preserve '{}' \; 
find ./media -type f -iname '*jpg' -exec sh -c 'jpegtran -outfile "{}.out" -optimize "{}"; mv "{}.out" "{}"' \; 
 | 
4. Let’s make final performance tests
Preliminary information:
1) We made a basic tuning Magento 2. It can be done even better personally under the store.
2) The pages for which we do Magento site speed test, we open in the browser before. That would get the page in the Varnish cache, it said “warmed up.” Because on this demo site we do not have a module for cache warmer and there are no more users who “warm up” the site.
3) In this article, we will not discuss the optimization of render-blocking JavaScript and CSS and JS minifications.
We think that a good mark for the store is 70+. A real store can have many different external scripts (chat rooms, analytics, marketing tools, etc). They all influence Google PageSpeed Insight.
Testing Magento speed (site load time) is necessary. Speed is an important metric in SEO, and also affects the user experience.
When a Googlebot indexes a site, it does not see the PageSpeed indicator, but only knows the speed itself.
Did you know that Google PageSpeed Insights does not measure the speed of your site? Read more detailed:
Google PageSpeed Insights does not measure the speed of the site.
To measure the download speed, you can use GTMetrix or Pingdom Tools.
From our point of view, there is no point in scrolling for Google PageSpeed indicators. The main speed of the store, as this affects the behavioral factor, it is very important for SEO.
Let’s look at the results of Google PageSpeed
1) Google PageSpeed Insight
Category page:


Product Page:
Configurable Product


2) Pingdom
Location: Stockholm, Sweden
Speed of category page:

Speed of product page (configurable product):

5. Additional steps that you can use for performance optimization.
- CDN
 - Cache Warmer
 - Nginx professional tuning
 - Docker Container & Kubernetes
 - image optimization
 
All these methods we will consider in our next articles and we will reveal each method of Magento Speed Optimization in more details.
Thank you for your attention. Hope that now you understand how to speed up Magento site. Keep up with our new performance workshops!

Valentyn KubrakChief Operating Officer
[转]How to speed up Magento 2. Maximum Performance的更多相关文章
- Website Speed Optimization Guide for Google PageSpeed Rules
		
原链接地址:http://www.artzstudio.com/2016/07/website-speed-optimization-guide-for-google-pagespeed-rules/ ...
 - (转) [it-ebooks]电子书列表
		
[it-ebooks]电子书列表 [2014]: Learning Objective-C by Developing iPhone Games || Leverage Xcode and Obj ...
 - DotNet 资源大全中文版(Awesome最新版)
		
Awesome系列的.Net资源整理.awesome-dotnet是由quozd发起和维护.内容包括:编译器.压缩.应用框架.应用模板.加密.数据库.反编译.IDE.日志.风格指南等. 算法与数据结构 ...
 - sysbench 压力测试
		
200 ? "200px" : this.width)!important;} --> 介绍 sysbench是一个模块化.跨平台.多线程基准测试工具,主要用于测试不同系统参 ...
 - sysbench的安装与使用(with MySQL)
		
sysbench是一款开源的多线程性能测试工具,可以执行CPU/内存/线程/IO/数据库等方面的性能测试. 项目主页: http://sysbench.sourceforge.net/ 安装文档htt ...
 - sysbench压力测试工具简介和使用(一)
		
sysbench压力测试工具安装和参数介绍 一.sysbench压力测试工具简介: sysbench是一个开源的.模块化的.跨平台的多线程性能测试工具,可以用来进行CPU.内存.磁盘I/O.线程.数据 ...
 - nginx调优
		
Nginx is an open-source Web Server. It is a high-performance HTTP server that uses very low server r ...
 - Temporary Segments: What Happens When a Sort Occurs (文档 ID 102339.1)
		
APPLIES TO: Oracle Database - Enterprise Edition - Version 8.1.7.4 to 11.2.0.1 [Release 8.1.7 to 11. ...
 - 【MySQL】Sysbench性能测试
		
两台MySQL配置不一样,要测试下性能差别 [m1] long_query_time = 0.1 log_slave_updates innodb_flush_log_at_trx_commit [m ...
 
随机推荐
- 面向对象总结、configparser配置文件模块、logging日志模块
			
面向对象总结 # 学习态度# python基础 2个月# html css js jq 1个月 # 上课困 # 学习方法 :# 列出知识点# 例子 写了哪些 # 面向对象学了哪些块# 为什么要讲面向对 ...
 - mysql添加外键的4种方式
			
今天开始复习,在过后的几天里开始在博客上记录一下平时疏忽的知识点,温故而知新 屁话不多--直接上货 创建主表: 班级 CREATE TABLE class(cid INT PRIMARY KEY AU ...
 - 一次对路边饮用水RFID供应机的跑路玩法
			
"如何成为一个合格的硬件白帽子? 答案: 一个有聪明大脑的你 要有归纳类比和善于用GOOGLE的能力(百度?放弃吧) 善于翻阅和查询相关开发文档和强大的跑路能力." WARNING ...
 - underscore.js源码研究(6)
			
概述 很早就想研究underscore源码了,虽然underscore.js这个库有些过时了,但是我还是想学习一下库的架构,函数式编程以及常用方法的编写这些方面的内容,又恰好没什么其它要研究的了,所以 ...
 - SSH 学习笔记
			
零.背景 在看 pm2 的 deploy 功能的时候,对 ssh 的不熟悉导致错误频出,包括之前对 github 的配置也用到了 SSH,所以找个机会整理一下. 一.介绍 SSH 是每一台 Linux ...
 - 虚拟机安装centos7
			
主要参考这个文档(我已经把网页保存到本地了): http://www.bkjia.com/Linuxjc/867013.html 主要注意: 1.虚拟机网络我选择的桥接模式,在CentOS安装时打开这 ...
 - Angular使用总结  ---  搜索场景中使用rxjs的操作符
			
在有input输入框的搜索/过滤业务中,总会考虑如何减少发起请求频率,尽量使每次的请求都是有效的.节流和防抖是比较常见的做法,这类函数的实现方式也不难,不过终归还是需要自己封装.rxjs提供了各种操作 ...
 - D3.js(v3)+react框架   基础部分之数据绑定及其工作过程与绑定顺序
			
数据绑定: 将数据绑定到Dom上,是D3最大的特色.d3.select和d3.selectAll返回的元素的选择集.选择集上是没有数据的. 数据绑定就是使被选择元素里“含有”数据. 相关函数有两个: ...
 - Ubuntu 12.04 安装Redis并设置主从复制
			
今天想在Ubuntu上安装一个Redis服务器并配置Master-Slave,一开始懒得连VPN就查了一些国内的文章,不知道是没有亲自验证过的转载文章,还是版本问题造成的,发现按照步骤都没能成功完成配 ...
 - #Python学习#python虚拟环境——virtualenv
			
前言 在Ubuntu系统中,系统一般会默认安装python2.x和3.x,像我近期买的阿里云ECS默认安装了2.7.2和3.5.2,所有pip安装的第三方包都会被放在默认的site-apckages目 ...