[PHP]记一次代码/服务器优化。

服务器配置:16G8H 4M的配置

已知问题:MySQL进程占用100%;带宽占满;

1.MySQL占用100%排查

修改了MySQL的配置,增大一些配置的设定值和缓存值,因为有查到设定值较低,大小上限后不够用时会进行持续申请内存的过程导致高CPU。效果不直观,不知道有没有用。

从用户请求的接口排查到代码会进行大数据的批量插入或更新,即会调用MySQL的insert into ... on duplicate key update的语句,因为操作的表是操作记录表,索引过多,猜测会在执行语句时进行索引重建(但暂没搜到相关的资料),为了排查问题先将其修改成批量的update语句;暂没感觉出区别。

单次查询的数据量大;因之前业务要求会一次性取出满足条件的数据,后续业务调整出现瓶颈则修改较多,则先过滤字段的返回,要求前端单条记录的详细数据再单独调取get接口获取。效果显著。

部分接口执行时长慢且前端没有做loading导致会重复请求;在接口上增加一个限制锁,3秒钟内只能进行一次请求,防止前端用户快速点击或觉得没反应重复点击。效果显著。

统计类代码占用资源;同上,随着数据增长,查询类代码速度越来越慢且占用资源;将数据修改成定时的队列更新到缓存,前端先返回缓存内数据。效果显著,但仍在执行时占用资源。

频繁调用大表的查询,虽然命中缓存,但还是会在高CPU下变成慢查询;加入了缓存,但该表为记录表,可能会导致数据不一致问题,需要埋点清除缓存。效果显著,但需要多处埋点。

大查询接口在不必要位置;可能因为接口复用问题,某些字段包含大数据量记录,但是当前调用场景并不需要,通过增加场景参数区分返回数据。效果显著。

2.带宽占满

资源方面;在之前使用的是纯文本内容并不涉及静态资源,貌似为了省钱没有使用CDN;

接口大小方面;接口数据实际不是很大,但因为带宽只有4M,在多请求下导致带宽不够用,也是因为之前的业务需求考虑简单和数据量小所以一开始没有考虑到(应该),所以也是修改成只返回必要的字段,虽然减少了至少3/2的内容,但还是数据较大。效果显著