|
|
这几年折腾 xiuno,从小站到中流量社区,踩了不少坑,也总结了一些能立竿见影的性能优化思路。不是玄学,也不全靠堆服务器,更多是把框架的短板补齐、把数据路径走顺。
先说数据库层。xiuno的表结构相对简单,但帖子列表、最新回复这类查询容易走到 filesort。我的做法是给常用查询列加“组合索引”,比如 thread 表针对 fid + lastpid 或 fid + create_date 建联合索引,避免排序落到磁盘。另外把 count(*) 的高
频操作改成读缓存,首页统计用 crontab 预先写到 kv 表,页面只读一条即可,少让 MySQL 做重复劳动。大表归档也要定期做,比如把一年以前的 thread 移到 thread_archive,线上查询永远命中热表,冷热分离能立刻降延迟。
缓存层别盲目用 Redis,把目标拆清楚。页面碎片(
页面碎片(比如导航、侧栏热门贴、公告)适合用本地 filecache 或 opcode cache,命中率高、开销小;而用户会话、队列这类需要跨进程共享的,再上 Redis。不要把整页 HTML 丢进缓存,xiuno 的页面个性化变量多,易造成雪崩和高回源。我的经验是把“计算贵但变化慢”的块切出来做片段缓存,并给不同块设不同 TTL,命中率能稳定在 80% 以上。
再说 PHP 运行时。关闭没必要的插件是第一步,很多性能问题其实是插件链式钩子拉长了 call stack。把常驻的钩子合并,能少一次 is_callable 就少一次。再就是开启 OPCache,设置 interned_strings_buffer 大一点;同时把 autoload 的路径整理,避免深层目录遍历。fpm 这侧,pm = static/ondemand 视流量而定:低流量用 ondemand 省内存,高并发用 static,把 pm.max_children 设到物理内存的甜点位,避免 swap。一条简单规则:请求数上不去,先看 CPU;相应时间抖动大,先看磁 |
|