压测能不能发现全局状态的并发问题?什么样的竞争压测碰得到、碰不到?为什么「压测没出错」不等于线程安全?这篇用 ab 与真实的 gunicorn 线程,把三种全局状态问题各压一遍。
窗口 0(中间没有任何让出) 计数 2000 / 2000(丢了 0 次,0.0%) 窗口 0.0001 秒 计数 1134 / 2000(丢了 866 次,43.3%) 窗口 0.001 秒 计数 422 / 2000(丢了 1578 次,78.9%) 加锁(窗口 0.001 秒的写法) 计数 2000 / 2000
上一篇:大文件响应性能;下一篇:Flask Development Server 与生产服务器(第 171 篇起是部署部分)。
第 143、145 篇从线程与进程的角度讲过全局变量,这一篇用压测的角度看它。第一次运行时我用 time.sleep(0) 当「读写之间的窗口」,一点竞争也没压出来,才发现窗口大小这个变量,于是加了几档窗口。
/sum 并发 1(同时有 /mutate 在改字典):3000 个请求里非 2xx 50 个;日志里「dictionary changed size during iteration」50 次 /sum 并发 32(同时有 /mutate 在改字典):3000 个请求里非 2xx 24 个;日志里「dictionary changed size during iteration」24 次
共用一个连接 3000 个请求(32 并发):非 2xx 0 个 | 日志里的异常类型 [] 每个请求自己的连接 3000 个请求(32 并发):非 2xx 0 个 | 日志里的异常类型 []