阿福的技术BLOG
百度空间 | 百度首页 
 
文章列表
 
2009-11-08 11:37
    最近打算写一个BitArray,用于统计大量整数号码的出现情况。标记完相关的bit后,再统计有多少个bit是1。于是问题出来了:怎么样快速统计一个字节中有多少个1?

第一反应是:
char a_byte = xxx;
int count = 0;
for (int i=0; i<8; ++i)
{
count += (a_byte>>i & 1);
}

还有什么技巧可以提高性能?
性能最好的办法其实是查表法:构造一个拥有256个元素的char数组,每个单元的值,是其对应下标的数值中的1的个数。那么,任意一个char在表中查找即可得知
 
2009-10-27 21:50
    今天对服务器进行压测,模拟的请求量到4万次/分的时候,进程的CPU占用就已经达到400%了(也就是把四个核都占到100%)。其实模拟的请求数据都是单一的,不会因为BUG的原因导致CPU过高。怀疑是代码里的STL用得过多,加之ttserver和memcached大量的读操作——大量的小内存分配可能带来全局的锁竞争,从而可能使得CPU过高。

之前听说过google的tcmalloc是一个很好的线程内的内存分配器,能够提高内存分配的性能。正好今天试试能不能改善我的代码的性能。
安装的过程如下:
#1、到google下载代码:
 
2009-10-26 21:09
    今天又犯了个低级错误,花了N多时间,换了N多办法,最终还是在导演(哦,其实是导师!)的帮助下找到了原因。
项目中使用ttserver做持久化存储,使用memcached作为缓存。某个逻辑是,先从cache获取数据,如果没有,再从ttserver获取数据,最后再把数据写回cache。
可是代码里不小心把memcached的初始化参数传入成ttserver的IP和端口。

就是这样一个简单的小动作,发现这个问题还真的非常不容易。因为ttserver是一个很好很强大的东东,它是完全兼容memcached客户端协议的,所以当memcached客户端连
 
2009-10-23 10:48
    tbb 2.2中提供了统一的头文件:tbb.h,只要包含这个文件就可以使用所有tbb的库了。
为了使用起来方便,以及可以使用静态库,可以使用以下这些命令自己创建:
# 1. 先下载 tbb22_20090908oss_src.tgz,  去 http://www.threadingbuildingblocks.org
# 2. 解压
tar -zxvf tbb22_20090908oss_src.tgz
cd tbb22_20090908oss
#编译,没必要直接make,很多东东其实不需要
make tbb && make tbbmalloc
#编译好的东东在build目录下,不同的编译器和操作系统,文件夹的名字不一
 
2009-10-22 20:47
    今天在写一个服务器程序的时候,发现请求量大的时候,程序发生崩溃,原因是我传入某个函数的string的size()过大。
这个程序是一个典型的生产者/消费者:生产者产生的信息放入 string,然后加锁放入std::queue中;消费者线程加锁,从std::queue.front()中获得对象的应用,然后pop()队头元素。一切看起来都是那么清晰简单。
消费者的代码看起来就像是这样:
string& str = q.front();
q.pop();
func( str.data(), str.size() );

为什么从队列取出string后,size就变了?
试了很
 
2009-10-20 20:17
    可以把ttserver理解成一种key-value形式的数据库,在运营中就像管理数据库一样去管理ttserver,使得性能和数据安全都能得到较好的保障。
部署ttserver的方式,可以根据访问量和数据规模循序渐进地这样部署:

1、单机:数据量不大,访问量不大
ttserver -host 192.168.0.100 -port 20001 -thnum 128 -dmn -ulim 1024m -ulog /home/ahfu/temp/test_data/test_ulog_01 -log /home/ahfu/temp/test_data/log/test_data_01.log -pid /home/ahfu/temp/test_data/log/test_data_01.pid -sid 1 /home/ahfu/t
 
2009-10-19 20:51
    ttserver中,可以用mhost和mport参数指定master的ip和端口。可是,到底是从master取数据呢?还是把自己的数据发送给master?还是同时做收取和发送?

下面是我的试验:
1、先启动一台独立的ttserver:
ttserver -host 192.168.0.100 -port 20001 -thnum 128 -dmn -ulim 1024m -ulog /home/ahfu/temp/test_data/test_ulog_01 -log /home/ahfu/temp/test_data/log/test_data_01.log -pid /home/ahfu/temp/test_data/log/test_data_01.pid -sid 1 /home/ahfu/temp/test_data/test_data_01.tch#bnum=1000
 
2009-10-19 18:29
    C/C++中使用return语句返回的时候,要吗返回某个类型,要吗什么都不返回。
那么,什么都不返回的时候,写成return void可以吗?测试发现,return void无法编译,不行。

但是,这样写呢?
void test1()
{
printf("test1\n");
}

void test2()
{
printf("test2\n");
return test1();         //函数返回了void,然后又return
}

以上就是无意间发现的语法,相当于,调用函数,然后return
 
2009-10-12 19:37
    今天部署程序的时候,发现主线程一直挂起,跟踪发现原来在调用memcached_get()函数的时候,一直不返回,程序停滞在此处。
奇怪的是,之前程序在别的服务器上都是好好的。
与之前的部署环境比较,我使用了新版的memcached,旧的环境的memcached版本是1.4.0,新环境中是1.4.1。
再检查初始化memcached的代码,哦,终于发现了特别的地方:
memcached_behavior_set(m_Mem,
MEMCACHED_BEHAVIOR_BINARY_PROTOCOL,
1ULL)    //某次测试的时候,把协议设置成二进制的了

 
2009-10-12 19:08
    对ttserver进行压测过程中发现,执行一段时间后,客户端API  tcrdbput()返回miscellaneous error,错误码为9999,而且再也不能插入数据,就算杀死ttserver再启动,也仍无法插入数据。

看似很严重!

其实,
真实的原因是……

磁盘写满了!!!

(晕倒一大片吧?磁盘满了也不给个正确的错误信息,害我吓担心半天,我也够晕的!)
 
     
 
 
文章分类
 
 
 
Linux(32)
 
Oracle(35)
 
c/c++(44)
 
Web(9)
 
杂谈(42)
 
 
Bash(1)
 
职场(12)
 
 
Tbb(12)
 
 
 
     
 
个人档案
 
ah__fu

上次登录:
10小时前
加为好友
 
   
 
最新评论
 
文章评论|照片评论


[表情]
 
 

强,支持你!~o~
 

回复9点的路灯:我知道你…………
 

ahfu童鞋,,do you know me..哈哈哈哈哈
 
     
 
订阅我的空间
 
已有人次访问本空间
 
订阅RSS  什么是RSS?

您也想拥有这样的空间?请点此申请。
     
 
最近访客
 
 

betterjml

m1353825

willorvision

joeychia

spwork

wangshyn

STOCKFPS

哈涵啦啦
     


©2009 Baidu