php中使用memcache擴充的效能問題
[文章作者:孫立 連結:http://www.cnblogs.com/sunli/ 更新時間:2010-08-28]
Memcached是一個高效能分布式緩衝系統,目前估計是很多公司的標配了,因為他被非常廣泛的使用,在各種語言下都有其豐富的client,所以很多後端服務也採用了相容的memcached協議,比如memcachedb, ttserver等等。所以最近我開發的佇列服務器也採用了memcached協議,底層是基於磁碟的儲存,單獨測試底層儲存的效能非常好,在我台式機能達到每秒寫入3萬1K的資料。
今天用php測試了下往剛剛開發的佇列服務器(icqueue)插入資料,代碼如下:
<?php
$mem=new Memcache();
$mem->addServer ("127.0.0.1",12001,false,1,100);
$start=microtime(true);
$str= str_repeat ("a",1024);//1k資料
for($i=0;$i<100000;$i++){
$mem->add("bbs_password_",$str,0,0);//入隊,bbs為隊列名稱,password為密碼
}
echo microtime(true)-$start;
?>
執行:[root@sunlitest1 bbs]# /usr/local/php/bin/php mem.php
5.6957609653473
花了5秒,感覺速度還是挺快,還是單進程跑的。接著我想測試大一點的資料,把其中的
$str= str_repeat ("a",1024);//1k資料
改為
$str= str_repeat ("a",1024*10);//10k資料
執行:[root@sunlitest1 bbs]# /usr/local/php/bin/php mem.php發現速度非常的慢,等了1分鐘也沒有成功。懷疑是佇列服務(icqueue)有問題,又換成memcached伺服器寫資料測試,發現速度同樣的慢。
這就排除了是服務端的問題。經過調整資料的大小,發現只要達到8K就非常慢。
然後懷疑是不是到了8K memcach自動進行了壓縮,是壓縮很慢呢?又去telnet進去,探索資料是沒有壓縮的。
剩下的問題應該就是網路問題了,翻看了memcach擴充的手冊,發現其中memcache.chunk_size的大小預設是8K,靈感一現,希望就是這這個問題導致的。
然後又改代碼:
<?php
ini_set('memcache.chunk_size',1024*15);//設定到15K
$mem=new Memcache();
$mem->addServer ("127.0.0.1",12001,false,1,100);
$start=microtime(true);
$str= str_repeat ("a",1024*10);//10k資料
for($i=0;$i<100000;$i++){
$mem->add("bbs_password_",$str,0,0);//入隊,bbs為隊列名稱,password為密碼
}
echo microtime(true)-$start;
?>
執行:[root@sunlitest1 bbs]# /usr/local/php/bin/php mem.php
10.800881147385
跑了10完成,OK,問題解決了。
memcache.chunk_size在php.ini設定的。大小推薦設定為你的資料的常規大小。