pupuk / blog

My New Blog. Record & Share. Focus on PHP, MySQL, Javascript and Golang.
MIT License
9 stars 2 forks source link

关于nginx,gin和php的一次压力测试 #33

Open pupuk opened 3 years ago

pupuk commented 3 years ago

机器配置

nginx

image

使用64个nginx worker进程,并与cpu绑定。允许打开文件设置成65535,一个worker进程同时能处理的链接是20480。 则在在这情况下: 同一时刻,nginx的server的总链接数 = 64(worker数量)* 20480(单个worker能处理的链接数)= 1,310,720

最下面是增加了gzip,我们本次测试,输入的文本都很少,最多几十个字节。故无影响,只是等下单独找个大的问题文件,坐下测试。 image 使用wrk压测,同时使用10k链接,同一个url重复3次,观测数据是否大致稳定。

image 数据稳定 ,nginx的qps大概在34w。

试试一个字节的url。 curl http://192.168.0.54/onebyte.html A 结果:qps也在34w左右。

瓶颈分析. image 目前的瓶颈在ECS连接数。CPU并没有打满。七牛云曾经做压力测试的时候说过,只能是网络成为瓶颈。不能让cpu,内存,磁盘,程序成为瓶颈。 既然是ECS连接数是瓶颈,也说明我们的压力测试,数据是可靠的。

因为压测的过程中,nginx的access_log会不停的记录日志,而我们挂载的是高效云盘,日志磁盘IO很可能是个瓶颈,关闭日志试试。 vim /etc/nginx/nginx.conf access_log off; systemctl restart nginx.service

重新wrk压测,qps还是在34w多,没有明显的变化。说明虽然是云盘,但是可能得益于写文件的buffer机制,并没有成为瓶颈。

其它发现,如果url返回的是空,一个字节都没有,qps能到70w左右。

接下来使用一个比较正经,常见的,文件size。 -rw-r--r-- 1 root root 332K Dec 22 16:56 baidu.html 复制的是百度首页的html文件,332k左右,是比较通用常见的size。 wrk -t128 -c10000 -d1m --latency -H "Accept-Encoding: zip, deflate" http://192.168.0.54/baidu.html 结果: Requests/sec: 10514.19

-rw-r--r-- 1 root root 15K Dec 22 17:41 json.html json文件,类似于抛json。 wrk -t128 -c10000 -d1m --latency http://192.168.0.54/json.html Requests/sec: 191705.70,qps 19w左右。

nginx压测结论

返回是空字节:qps能到70w 短字节:qps约在34w 十几k:qps约在19w 百k字节,qps约在1w左右。

pupuk commented 3 years ago

gin的压力测试

代码如下:

package main

import (
    "net/http"
    "time"

    "github.com/gin-gonic/gin"
)

func main() {
    r := gin.Default()
    r.GET("/ping", func(c *gin.Context) {
        c.JSON(http.StatusOK, gin.H{
            "message": "pong",
        })
    })

    r.GET("/string", func(c *gin.Context) {
        c.String(http.StatusOK, "This is a text")
    })

    r.GET("/sleep25ms", func(c *gin.Context) {
        time.Sleep(25 * time.Millisecond)
        c.String(http.StatusOK, "have sleep 25ms")
    })

    r.GET("/sleep250ms", func(c *gin.Context) {
        time.Sleep(250 * time.Millisecond)
        c.String(http.StatusOK, "have sleep 250ms")
    })

    r.Run(":8080")
}

image

image 因为gin会不断地向stdout输出日志,可能是个影响,我们让二进制文件在后台运行,并将stdout,stderr重定向到/dev/null

nohup ./main >/dev/null 2>&1 & 结果: Requests/sec: 283637.85, qps约提提高了10倍。

模拟db等操作,25ms延迟 wrk -t128 -c30000 -d1m --latency http://192.168.0.54:8080/sleep25ms Requests/sec: 270306.91

模拟大的延迟操作,250ms延迟,比如调用其它接口 wrk -t128 -c30000 -d1m --latency http://192.168.0.54:8080/sleep250ms Requests/sec: 106070.58

pupuk commented 3 years ago

PHP

使用php8+opcache+jit image

opcache+jit配置

zend_extension=opcache.so
opcache.enable=1
opcache.enable_cli=1
opcache.memory_consumption=2048
opcache.interned_strings_buffer=64
opcache.max_accelerated_files=100000
opcache.validate_timestamps=0
opcache.fast_shutdown=1
opcache.save_comments=0

opcache.jit_buffer_size=100M

php-fpm配置

pm = dynamic
pm.start_servers = 2000
pm.max_children = 5000
pm.min_spare_servers = 1500
pm.max_spare_servers = 3000

wrk -t128 -c10000 -d1m --latency http://192.168.0.54/index.php image