Hugh's Blog

Yii2 生产环境性能优化

最近在使用 wrk 进行网站压力测试,文章 里面测试本站时 QPS 只有 15 左右,而刚好是周末,记录一下优化的过程。

首先使用缓存,本站选择了 Redis,Yii2 官方有扩展,安装了就行。

MySQL 方面暂时也没什么好优化了,毕竟是小网站,索引也没加,但是减少连接数也是必要的,另外 Yii2 Debug Toolbar 挺好用的,列出了所有 MySQL 连接并能按耗时排序,代码上修改了一些查询逻辑,基本上数据都存 Redis 了。

本文主要是记录了 Yii2 生产环境上的一些优化设置,官方文档也有,详细的可以去看文档,这里只是做个记录。

PHP 环境设置

  • 使用最新版本,目前 PHP7.2

  • 启用 Opcache,测试了以下,开启之后 QPS 能达到 50 左右

使用生产环境入口文件,没什么好说的。

使用缓存 Redis,目前 markdown 的渲染还是前台,没用缓存,有空再加上。

开启数据库 Schema 缓存:

return [
    // ...
    'components' => [
        'db' => [
            'class' => 'yii\db\Connection',
            'dsn' => 'mysql:host=localhost;dbname=mydatabase',
            'username' => 'root',
            'password' => '',

            // Enabling Schema Caching
            // Just empty `/app/runtime/cache/` folder or use `php yii cache/flush-schema` to delete cache
            'enableSchemaCache' => true,
            // Duration of schema cache.
            'schemaCacheDuration' => 3600,
            // Name of the cache component used to store schema information
            'schemaCache' => 'cache',
        ],
    ],
];

前端资源文件压缩,资源不多,没做处理。

优化 Session 存储,可以保存在数据库或缓存 (Redis) 中,没做处理。

优化数据库,比如加索引等,没做处理。

数据查询结果返回数组。

优化 Composer Autoloader,避免加载太多第三方类,执行以下命令:

composer dumpautoload -o

后台处理数据,比如消息队列、定时任务等,没做处理。

代码性能分析,Yii2 Debug Toolbar 就挺好用的。

这些都是简单的优化,基本上都可以做到。

对于这次优化,感觉带来提升比较大的还是缓存,比如 Opcache、Redis,而对于一些服务器参数、MySQL 参数、php-fpm.conf 参数等倒是没怎么调整,都是默认设置,要调这些,还是需要花点时间在服务器上测试的,暂时还没去搞。

下面来看下 wrk 测试的一些数据。

优化前:

# wrk 请求
docker run --rm --net=host williamyeh/wrk -c 100 -t 3 -d 2m --latency --timeout 30s https://imhugh.com/
Running 2m test @ https://imhugh.com/
  3 threads and 100 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency     4.20s   528.76ms   6.50s    83.56%
    Req/Sec     8.35      5.29    40.00     68.61%
  Latency Distribution
     50%    4.19s
     75%    4.42s
     90%    4.83s
     99%    5.31s
  2135 requests in 2.00m, 11.12MB read
Requests/sec:     17.78
Transfer/sec:     94.83KB

# top 服务器状态
top - 20:27:28 up 5 days,  6:53,  1 user,  load average: 2.03, 1.37, 0.73
Tasks: 121 total,   6 running, 115 sleeping,   0 stopped,   0 zombie
%Cpu(s): 90.3 us,  9.0 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.7 si,  0.0 st
KiB Mem :  1012524 total,   172920 free,   349592 used,   490012 buff/cache
KiB Swap:        0 total,        0 free,        0 used.   448728 avail Mem

  PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND
27204 www-data  20   0  204792  21508  10556 R 17.9  2.1   0:26.65 php-fpm
27205 www-data  20   0  204752  21284  10492 R 17.9  2.1   0:27.46 php-fpm
27196 www-data  20   0  204780  21484  10532 R 17.6  2.1   0:31.92 php-fpm
27213 www-data  20   0  204716  21188  10428 R 17.6  2.1   0:05.20 php-fpm
27214 www-data  20   0  204736  21184  10428 R 17.6  2.1   0:05.08 php-fpm
30827 999       20   0 1140588 204180   7944 S  9.0 20.2   7:45.73 mysqld
 2399 root      20   0  593872  45908  22048 S  1.0  4.5  16:14.00 dockerd
 5732 systemd+  20   0   76728  14220   2624 S  1.0  1.4   1:47.70 nginx

优化后:

# wrk 请求
docker run --rm --net=host williamyeh/wrk -c 100 -t 3 -d 2m --latency --timeout 30s https://imhugh.com/
Running 2m test @ https://imhugh.com/
  3 threads and 100 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency   656.52ms  351.49ms   5.81s    89.87%
    Req/Sec    57.62     24.40   141.00     68.77%
  Latency Distribution
     50%  526.43ms
     75%  684.24ms
     90%    1.01s
     99%    1.88s
  18576 requests in 2.00m, 96.99MB read
  Non-2xx or 3xx responses: 32
Requests/sec:    154.75
Transfer/sec:    827.43KB

# top 服务器状态
top - 19:26:10 up 7 days,  5:52,  1 user,  load average: 3.41, 0.98, 0.33
Tasks: 123 total,   8 running, 115 sleeping,   0 stopped,   0 zombie
%Cpu(s): 73.0 us, 17.3 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  9.7 si,  0.0 st
KiB Mem :  1012524 total,   118716 free,   338148 used,   555660 buff/cache
KiB Swap:        0 total,        0 free,        0 used.   436692 avail Mem

  PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND
11959 www-data  20   0  337168  26148  18748 R 15.0  2.6   0:23.82 php-fpm
12328 www-data  20   0  337104  21092  13964 R 15.0  2.1   0:08.18 php-fpm
12329 www-data  20   0  337104  21092  13964 R 15.0  2.1   0:08.04 php-fpm
 9333 www-data  20   0  337168  24288  16896 R 14.6  2.4   0:40.31 php-fpm
11960 www-data  20   0  337168  24300  16896 R 14.6  2.4   0:24.45 php-fpm
 3664 999       20   0   45744   5888   2964 R  9.3  0.6   5:41.61 redis-server
 4844 systemd+  20   0   71532   6432   3092 S  8.3  0.6   2:11.66 nginx
 2399 root      20   0  610264  48560  17532 S  7.3  4.8  23:05.59 dockerd
 4031 root      20   0  315104  14052  12268 S  1.0  1.4   0:12.70 docker-containe
 3686 999       20   0 1139548 209204  17052 S  0.3 20.7   1:25.73 mysqld
12330 shen      20   0   42104   3652   3048 R  0.3  0.4   0:00.04 top

可以看到,QPS 从 17 提升到了 154,99% 的请求时间也从 5 秒多提升到 2 秒内,而从 top 统计里面看出,CPU 使用也有所降低,看来优化还是有点作用的,感觉是缓存带来的提升,目前来说就这样吧。


参考

Performance Tuning