免费注册 查看新帖 |

Chinaunix

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

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

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

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

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

AA.jpg

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
2 [报告]
发表于 2003-08-03 00:27 |只看该作者

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

怀疑是不是只用两个队列比较费时间,因为每次不管读还是写都要加锁。


你的读写应该是你图上的send和read吧,如果是的话,你现在同步是怎么控制的。

论坛徽章:
0
3 [报告]
发表于 2003-08-03 00:35 |只看该作者

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

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

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

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

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

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

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
4 [报告]
发表于 2003-08-03 00:40 |只看该作者

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

对方支持异步吗?

论坛徽章:
0
5 [报告]
发表于 2003-08-03 00:51 |只看该作者

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

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

论坛徽章:
0
6 [报告]
发表于 2003-08-03 08:48 |只看该作者

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

现在是将数据库的表全部读入到内存中的三张HASH表里,所以查询线程应该花不了多长时间。


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

自己控制的话,要将锁控制细一些,也就是要支持行锁定.不能一锁,就锁一个表,且能多个用户读一个行,但是这个时候不能有写的;一次只能有一个写,就是读写锁的功能.
比较复杂..........

还是试验一下数据库的方法,在说,

论坛徽章:
0
7 [报告]
发表于 2003-08-03 09:22 |只看该作者

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

1、几个线程之间的时间差尽量减少。就是读到任务后处理线程能尽快处理,处理完后能尽快发送。
   2、socket的缓冲区开大一些,避免发送不成功。
   3、我想锁占用时间应该不会有多大影响。
   4、每秒500个业务,采用这种C/S结构,非常难达到。如果用单个客户端测试,可能永远达不到,我想应理解成服务端并发处理能力,那么测试时需要启动多个客户端。可能更能测试出服务端的效率。

论坛徽章:
0
8 [报告]
发表于 2003-08-03 11:08 |只看该作者

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

原帖由 "大菠萝" 发表:


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

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


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

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

论坛徽章:
0
9 [报告]
发表于 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
10 [报告]
发表于 2003-08-03 11:48 |只看该作者

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

1、关于队列的同步我觉得方法不是很好。
while(1){
   Queue.Lock() ;
   if (Queue.IsEmpty()){
      Queue.Unlock() ;      
      usleep(1) ;
      continue ;      
   }
   pData = Queue.RemoveHead() ;
   Queue.Unlock() ;
...............
...............

}
如果系统对usleep支持得不好,可能延时较大(不同平台差别较大)。如果处理得好,那么占用系统资源非常多!lock、unlock属于内核操作。
具体的是否可以试试阻塞式读取。
2、TCP设置个1M、2M应该是可以得,你可查一下相关资料。
3、lock虽然不慢,但频繁调用吃CPU很厉害的。
4、我觉得需要综合考虑,不要为了你这一部分得效率占用太多资源,毕竟主机还要处理很多业务上的东西。片面的强调传输和对列的效率不大可取。
所以你在测试时应该注意观察主机CPU占用情况,注意不要多了,如1%以下是可以接受的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP