测试方案
容器准备
1 | docker run --name=redis -itd -p 10000:80 feisky/redis-server |
数据准备
1 | curl http://127.0.0.1:10000/init/5000 |
测试
1 | while true; do curl http://192.168.0.10:10000/get_cache; done |
现象
接口响应要7s,用top查看cpu0的us是11.1,wa是35.6,初步判断是io的问题,cpu占用较高的进程是Pyhton和redis-server
1 | top - 12:37:23 up 4 days, 13:13, 2 users, load average: 0.51, 0.25, 0.20 |
我们用iostat -d -x进一步定位io的问题,发现很奇怪的发现一个查询接口居然有大量的write
1 | iostat -d -x 1 |
用pidstat -d 定位发现是redis-server在写,接着我们用strace定位,发现有大量的write和fdatasync,经过排查发现我们的redis-server用的是AOF策略是alwalys,每条指令都需要write和fsync,会产生大量的write。我们改变策略改为everysec,问题解决大部分,为什么是大部分,我们看到西面的命令存在大量的SADD。这些是没必要的,我们可以通过修改代码优化。
1 | strace -f -T -tt -p 394 |
经过修改AOF的策略和优化掉SADD命令相关代码接口响应市场降为0.16034674644470215ms