第四章 压力测试

我们都知道,互联网应用必须要做的一步就是压力测试,因为每天互联网应用都要面对成千上万的请求。虽然Odoo的定位是企业内部应用,但一旦企业规模变大,服务器也面临着并发带来的压力,因此压力测试也是Odoo运维过程中必不可少的环节之一。本章将带领读者使用Python的压力测试工具Locust来对我们的Odoo应用进行压力测试评估。

任何系统不论如何优化,都会又一个性能的瓶颈,我们做压力测试的目的就是想要知道在一定标准的范围内,服务器经过最优优化后的极限性能在哪,以便我们在预估服务器到达性能极限之前及时对软硬件进行升级,以应对即将到来的压力挑战。

Locust简介

Locust是Python写的压力测试工具,拥有简单明了的UI控制界面和图形报表,而且支持分布式测试。写一个Locust测试脚步也非常简单。

首先,我们安装这个工具:

pip install locustio

启动命令:

locust -f locust_files/my_locust_file.py --host=http://example.com

f 参数指明脚本文件所在目录 host 参数为web访问地址,通常设置为ip地址或者0.0.0.0即可。

启动后可以看到日志输出:

kevin@kevin:~/codes/script/python/locust_test$ locust -f odoo_test.py --host=http://0.0.0.0
[2019-08-26 13:07:40,330] kevin/INFO/locust.main: Starting web monitor at *:8089
[2019-08-26 13:07:40,331] kevin/INFO/locust.main: Starting Locust 0.11.0
[2019-08-26 13:07:48,618] kevin/INFO/locust.runners: Hatching and swarming 200 clients at the rate 1 clients/s...
[2019-08-26 13:12:31,373] kevin/INFO/locust.runners: All locusts hatched: Tester: 200

编写脚步测试文件

我们新建了一个Controller,用于接收Locust发出的请求,简单起见没有做登陆认证。

class LocustTest(http.Controller):
    @http.route('/locust_test/locust_test/', auth='public')
    def index(self, **kw):
        return "Hello, world"

    @http.route('/locust_test/locust_test/write/', auth='public')
    def list(self, **kw):
        # return http.request.render('locust_test.listing', {
        #     'root': '/locust_test/locust_test',
        #     'objects': http.request.env['locust_test.locust_test'].search([]),
        # })
        sale_obj = request.env["sale.order"].sudo()
        # 创建订单
        order = sale_obj.create({
            "partner_id":7,
            "order_line":[(0,0,{
                "product_id":1,
            })]
        })
        # 删除订单
        order.unlink()
        return "Test Done"

然后我们编写压力测试脚本:

from locust import HttpLocust,TaskSet,task

class TestOdoo(TaskSet):
    def on_start(self):
        self.test_sale_order()

    @task(1)
    def test_sale_order(self):
        self.client.get("http://192.168.23.129:8070/locust_test/locust_test/write/")

class Tester(HttpLocust):
    task_set = TestOdoo
    min_wait = 50
    max_wait = 200

启动测试

我们打开Locust控制页面:

我的测试虚拟机1核2G内存,200用户1并发的结果如下:

也可以看到请求曲线:

可以看到我的小服务器能够支持每秒8个请求的处理。

results matching ""

    No results matching ""