今天用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設置的。大小推薦設置為你的數據的常規大小。