免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 8041 | 回复: 12
打印 上一主题 下一主题

大家给我支支招怎样才能提高性能 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-08-03 00:19 |显示全部楼层 |倒序浏览
大概是这样一个需求,通过TCP与CLIET建立一个连接
然后从CLIET读入请求,然后经过查询,最后将结果传回CLIET
我用pthread做的,目前的结构就是下面的图。
现在是将数据库的表全部读入到内存中的三张HASH表里,所以查询线程应该花不了多长时间。
要求做到每秒完成500次业务,我现在还有相当的差距。
怀疑是不是只用两个队列比较费时间,因为每次不管读还是写都要加锁。

大家给支支招。看怎么样能提高性能。

AA.jpg (16.75 KB, 下载次数: 66)

AA.jpg

论坛徽章:
0
2 [报告]
发表于 2003-08-03 00:35 |显示全部楼层

大家给我支支招怎样才能提高性能

readthread 通过tcp拿到客户发来的东西会把他分解成
一个一个的请求,然后放进队列里,放的时候加锁

每个querythread轮询和readthread之间的队列,发现有东西就拿出来
进行查询操作。操作完后生成要发送的包,放到与 sendthread之间的队列中。

sendthread只管从队列中取包并发送。

连接描述字是随着其他信息一路传过来给sendthread的。

我说的读和写是指对队列的读写操作。

论坛徽章:
0
3 [报告]
发表于 2003-08-03 00:51 |显示全部楼层

大家给我支支招怎样才能提高性能

是的,确切的说那头也要我来写
呵呵。

论坛徽章:
0
4 [报告]
发表于 2003-08-03 11:08 |显示全部楼层

大家给我支支招怎样才能提高性能

原帖由 "大菠萝" 发表:


你用的是什么数据库?
我觉得你这样做,可能没有必要,可以在数据库中直接将数据表放入内存中,用位图索引,速度很快的,且这样做了,数据库能控制并发访问的,你可以试验一下,看能不能达到你的要求.在oracle中,将表放?.........
   

[quote]原帖由 "unicorns"]现在是将数据库的表全部读入到内存中的三张HASH表里,所以查询线程应该花不了多长时间。 [/quote 发表:


不过你说的那个alter table是什么意思。很有兴趣听一下。

我加锁是给交换数据的队列加锁,是用双向链表实现的队列,这样要读写一个记录肯定要影响其他记录,只对一条记录加锁不好实现。

论坛徽章:
0
5 [报告]
发表于 2003-08-03 11:20 |显示全部楼层

大家给我支支招怎样才能提高性能

原帖由 "mengwg" 发表:
1、几个线程之间的时间差尽量减少。就是读到任务后处理线程能尽快处理,处理完后能尽快发送。
   2、socket的缓冲区开大一些,避免发送不成功。
   3、我想锁占用时间应该不会有多大影响。
   4、每秒500个业务,..........
   

多谢多谢,看来mengwg是很有经验的
1。我现在是这么做的。在每个向队列放数据的动作中
是用一个阻塞的Queue.Lock()

  1. Queue.Lock() ;
  2. Queue.AddTail(&data) ;
  3. Queue.Unlock() ;
复制代码

从队列中取数据是

  1. while(1){
  2.    Queue.Lock() ;
  3.    if (Queue.IsEmpty()){
  4.       Queue.Unlock() ;      
  5.       usleep(1) ;
  6.       continue ;      
  7.    }
  8.    pData = Queue.RemoveHead() ;
  9.    Queue.Unlock() ;
  10. ...............
  11. ...............

  12. }
复制代码

这样写能不能保证在第一时间处理,怎么能改进一下。

2。TCP的缓冲区默认是多大,最大有限制吗?我用的是SOLARIS 8
3。这是个定心丸,如果用多个队列交换的话,还有很多麻烦事要做。
4。现在是用线程池来支持并发的,不过测试条件还不具备,sigh。

论坛徽章:
0
6 [报告]
发表于 2003-08-03 11:54 |显示全部楼层

大家给我支支招怎样才能提高性能

原帖由 "mengwg" 发表:
1、关于队列的同步我觉得方法不是很好。
while(1){
   Queue.Lock() ;
   if (Queue.IsEmpty()){
      Queue.Unlock() ;      
      usleep(1) ;
      continue ;      
   }
   pData = Queue.Remo..........
   

你的意思是把usleep去掉
我也知道这个不准,误差比较大
但是如果去掉的话,取队列的几个线程都在轮询队列,会不会LOCK的太频繁了     

你提到的阻塞式读取是针对队列来说的吗

论坛徽章:
0
7 [报告]
发表于 2003-08-03 15:38 |显示全部楼层

大家给我支支招怎样才能提高性能

原帖由 "夜未眠" 发表:
对数据库没作任何优化的话当然是你人为的hash要高得多。
不过数据库有索引,并且有很多索引类型(postgresql就包括hash)。并且能够对经常触发的查询作出优化。如果建立索引并常对数据库作analyze,效率就完全是两回事..........
   

具体需求具体分析嘛
做这个东西主要是在客户和数据库间建一个简单协议。
这样以后整个系统中的所有客户端都使用这个简单协议与这个程序通信
这样做的好处是以后如果数据库有所变动,只需要改这里而不需要去修改各个客户端。

至于查询速度,愚认为没有比我的HASH更快的了
因为我的HASH开了很大的内存,是不惜内存的换取速度(其实也没用多少)
机器有1g的内存,我最多用个200M了不起了。HASHKEY使用的是记录的ID,
散列就是简单求余,因为ID是连续的,所以基本没有冲突(当然闲置空间很多
但每个闲置空间也就是4个字节一个指针,加起来也没多少)。我查找起来就是一次求余操作就可以了。什么样的索引和优化可以比这样的HASH更快?

请大家关注于我提出的问题,其他方面由于具体需求的不同所产生的分歧就放在一边吧。谢谢

论坛徽章:
0
8 [报告]
发表于 2003-08-04 14:41 |显示全部楼层

大家给我支支招怎样才能提高性能

原帖由 "snowpy" 发表:
1.每个客户端的连接数
2.是长连接还是短连接
3.是同步还是异步
   

1,目前是单个客户端的测试,每个客户端一个连接
2,长连接
3,异步。

论坛徽章:
0
9 [报告]
发表于 2003-08-04 14:42 |显示全部楼层

大家给我支支招怎样才能提高性能

原帖由 "deathbravo" 发表:
请问您的速度达到多少次了?
我的问题与您类似;
只是我没有自己hash
直接做数据库操作的
   

发帖子的时候是每秒130到140的样子
现在把测试的客户端的程序改了一下,目前是每秒330的样子。

论坛徽章:
0
10 [报告]
发表于 2003-08-04 14:48 |显示全部楼层

大家给我支支招怎样才能提高性能

原帖由 "gadfly" 发表:
不知道你这三类线程的比例如何安排的?

queue lock的怎么一个实现方式?

另外gcc有个-p参数,可以产生跟踪执行的数据。可以用prof工具分析。你可以试试看
   

一个连接就只对应一个read和send
querythread的个数比例正在测试看如何才合适。

lock用的是pthread_mutex
pthread_mutex_lock()
不论读或写都要先把整个队列锁住,队列是用双链表实现的。

多谢大家关注,现在性能还算到了我可以接受的范围了,单个客户端一个连接每秒将近350个了。如果并发的话应该还会有所提高。谢谢大家
尤其感谢mengwg的意见。呵呵 //bow
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP