1. 不要盲目靠 ab 来断定性能好坏
Apache 提供了 ab 工具来检查 httpd 性能,当然也间接的求出 php 的执行效率。在以往开发底层框架时,我总是用 ab 来检验性能和瓶颈,但是由于测试环境一直都在本地或局域网内的测试机,因此网络传输几乎可以忽略不计的,包括在上一个项目,我们在中国移动的机器上,也是通常由服务器 A ab 服务器 B。在这次操作中,这个因素也被惯性忽略了,尽管机器也是在同一个机房,但是机器时 IDC 买的,带宽都有一定的限制。我们在本地测试时,可达到 500RPS 的页面,在线上只能到 15~20RPS,等我们发现时带宽原因时,我们已被误导做了不少错误的决定⋯⋯
2. 独立数据库并不是就会提速
上线计划里,我们是先使用单服务器来支撑 80 多个站点,但由于 MySQL 的 CPU 高居不下,我们选择了把 MySQL 和 Sphinx 分离到另外一台服务器上,性能上当然是好了,但是 Web 服务器 和数据库服务器 的往返数据流量也占用了一定的带宽 ,性能的提升并没有想象中这么理想,更重要的是成本增加了。
3. 小缓存不如不用
缓存 应该尽可能做大,意思是,比如我们要缓存分类,而通常这些分类又不会是很大的数据量,比如 1000 行以内,那么我们可以直接对整个分类表进行大缓存,而获取某个分类的信息,可以直接通过分类 ID 从大缓存中获取,而无需单独做一个分类的小缓
function getCategories()
{
static $list;
if (!isset($list)) {
if ($cache = cache::get('categories')) { // 缓存存在
$list = $cache->data; // 获取缓存
} else {
$result = $db->get('categories');
$list = $result->allWithKey('cid'); // 这里用 cid 作为结果数组的 key
cache::save('categories', $list); // 写入缓存
}
}
return $list;
}
function getCategory($cid)
{
$list = getCategories();
return isset($list[$cid]) ? $list[$cid] : false;
}
4. memcached 并不总比 file 快
在我们的测试中,在 2000 个 cache 的情况下,memcached 甚至比 file 的性能还要差。