Chinaunix

标题: C还是C++? for socket server [打印本页]

作者: dn2010    时间: 2011-11-26 17:10
标题: C还是C++? for socket server
用C还是C++? 就开发socket server而言。本人C++还不熟悉。请多批评指教。
需要高性能、模块化、参数化、可扩展性等等。

注:调用的具体业务程序不是用C、C++写的。
作者: flw    时间: 2011-11-26 17:13
Node.js
作者: dn2010    时间: 2011-11-26 17:25
谢谢!
只能是C或C++,二选一。
就开发通讯模块而言,C++的面向对象有何优势?使用C++而不是C是否带来性能上的损失?我要求峰值 5000 TPS 的处理能力。
作者: a1406    时间: 2011-11-26 18:52
本帖最后由 a1406 于 2011-11-26 18:53 编辑

都阔以啊。   C比C++性能上没啥大的优势,C++的面向对象比起C来也没啥特别的优势。  哪个熟悉用哪个。 5000TPS是啥意思压
作者: yulihua49    时间: 2011-11-26 21:13
用C还是C++? 就开发socket server而言。本人C++还不熟悉。请多批评指教。
需要高性能、模块化、参数化、可 ...
dn2010 发表于 2011-11-26 17:10



    都可以。c的socket可以由C++使用,反之亦可。
作者: yulihua49    时间: 2011-11-26 21:16
本帖最后由 yulihua49 于 2011-11-26 21:30 编辑
谢谢!
只能是C或C++,二选一。
就开发通讯模块而言,C++的面向对象有何优势?使用C++而不是C是否带来性能 ...
dn2010 发表于 2011-11-26 17:25



    都没问题。
我用Csocket,线程池调度,C++service函数。最高达到60000TPS,10台服务器,2台交易调度器+2台LVS实现的。

其实多少TPS与C或C++或socket关系不大。看你的数据库处理能力和应用逻辑的复杂度。
socket的开销在整个系统中不关键。

我们在测试中发现在5000TPS左右有一个坎,过这个坎很难。
后来发现我们的交易包是JSON格式,大约20-30K,5000TPS在千兆网饱和了。
在socket传输时压缩,压缩比10-15,问题解决了。
虽然压缩加大了CPU的负荷,但解决了网络瓶颈。现在60000TPS又是网络瓶颈了。
作者: walleeee    时间: 2011-11-26 22:19
回复 2# flw


    nodejs性能如何?有测评么?
作者: ux400    时间: 2011-11-27 10:02
本帖最后由 ux400 于 2011-11-27 10:04 编辑
都没问题。
我用Csocket,线程池调度,C++service函数。最高达到60000TPS,10台服务器 ...
yulihua49 发表于 2011-11-26 21:16



用过AS/400上的多线程吗?线程安全问题如何考虑?
作者: SoforthHe    时间: 2011-11-27 10:51
本帖最后由 SoforthHe 于 2011-11-27 10:54 编辑
谢谢!
只能是C或C++,二选一。
就开发通讯模块而言,C++的面向对象有何优势?使用C++而不是C是否带来性能 ...
dn2010 发表于 2011-11-26 17:25



    LZ,C/C++关系都不大的。
作者: SoforthHe    时间: 2011-11-27 10:59
本帖最后由 SoforthHe 于 2011-11-27 11:20 编辑
都没问题。
我用Csocket,线程池调度,C++service函数。最高达到60000TPS,10台服务器 ...
yulihua49 发表于 2011-11-26 21:16



    我在Linux下测试过,16核CPU(Intel(R) Xeon(R) CPU   E5620  @ 2.40GHz ),使用epoll+多线程,简单的回射服务测试,单台机器处理能力可达到60W次/s(webbench压测),TCP参数设置(setsockopt)对性能影响很大。
考虑EPOLL吧。。
作者: evaspring    时间: 2011-11-27 12:53
nodejs 我最近也一直在关注, 不过目前类库过于缺乏  并且还没有商业应用
作者: yulihua49    时间: 2011-11-27 20:27
本帖最后由 yulihua49 于 2011-11-27 20:46 编辑
用过AS/400上的多线程吗?线程安全问题如何考虑?
ux400 发表于 2011-11-27 10:02



   没。
但用过 Z/LINUX和Z/TPF

线程安全是完全一样的。就是那些规则。

在中间件里进行线程调度, service函数里只需要保证线程安全即可。

在线程池模型里,一个service,他没有状态变量(就是跨服务的)可用,全局变量、局部变量、线程特定变量都不行。由于有的作业是经过很多线程先后完成的同时又有很多其它线程进行着类似的工作。
因此中间件框架需要提供一个功能,为应用保存上下文(context,又叫session)。这个context由应用模块(service)定义和使用,由框架保存和管理。

http://bbs.chinaunix.net/thread-3613277-1-1.html
http://blog.chinaunix.net/space. ... blog&id=2983824
http://bbs.chinaunix.net/viewthr ... p;extra=&page=1
作者: yulihua49    时间: 2011-11-27 20:48
本帖最后由 yulihua49 于 2011-11-27 20:51 编辑
我在Linux下测试过,16核CPU(Intel(R) Xeon(R) CPU   E5620  @ 2.40GHz ),使用epoll+多线程, ...
SoforthHe 发表于 2011-11-27 10:59



    当然要看包的大小和业务的复杂度啊!
还有你对包数据进行压缩和加密,就处理不了那么快了。

线程池要比多线程快。一般当线程数是CPU数的1-2倍最快,再多就慢下来了。
作者: ux400    时间: 2011-11-28 00:31
没。
但用过 Z/LINUX和Z/TPF

线程安全是完全一样的。就是那些规则。

在中间件里进行线程调 ...
yulihua49 发表于 2011-11-27 20:27



谢谢!AS/400上除了线程安全外,还有个事务处理的问题,找了一下资料,发现:
        事务处理是JOB级,或活动作业组级的。因为我们无法知道,也无法控制线程运行与活动作业组的对应关系,于是事实上,事务处理就不能针对单个线程了。
        如果同时有多个线程在进行数据库操作,那一个一个线程的commit操作,可能会导致另一个活动中的线程也执行了commit操作。
        于是多线程编程,在实际上就不支持事务处理。

这是否意味着AS/400上OLTP系统还是不能用多线程?
作者: SoforthHe    时间: 2011-11-28 09:08
当然要看包的大小和业务的复杂度啊!
还有你对包数据进行压缩和加密,就处理不了那么快了。

...
yulihua49 发表于 2011-11-27 20:48


线程池要比多线程快 有这种说法吗?
作者: yulihua49    时间: 2011-11-29 13:55
本帖最后由 yulihua49 于 2011-11-29 14:02 编辑
线程池要比多线程快 有这种说法吗?
SoforthHe 发表于 2011-11-28 09:08



不是有无这种说法,而是有这种测试结果。
过多的线程导致资源消耗大,调度困难。
线程池把线程数限制在一个合理的范围内以取得最高的性能。
作者: yulihua49    时间: 2011-11-29 13:58
本帖最后由 yulihua49 于 2011-11-29 14:07 编辑
谢谢!AS/400上除了线程安全外,还有个事务处理的问题,找了一下资料,发现:

这是否意味着AS/400 ...
ux400 发表于 2011-11-28 00:31



    这不是AS400的问题,而是所有系统的问题。AS400也是一样的。
在多线程里,不能多线程共享一个数据库连接,而是要做一个数据库连接池,由各线程使用。
每个连接在一个时间段里最多只属于一个线程。

OLTP可以每个线程一个数据库连接,也可以使用数据库连接池。
OLTP从来都是可以多线程的。

我们使用多线程OLTP已经多年,INFORMIX,ORACLE,SYBASE,DB2都做过。
作者: windyrobin    时间: 2011-11-29 15:59
回复 2# flw


flw 老大 开始关注nodejs 了?? 哪家公司? 有成功案例经验否?
作者: windyrobin    时间: 2011-11-29 16:02
回复 11# evaspring

taobao 数据产品部 已经开始广泛 node 了

http://cnodejs.net

http://cnodejs.org
作者: dn2010    时间: 2011-11-29 21:45
谢谢各位!
作者: evaspring    时间: 2011-11-29 22:51
回复 19# windyrobin


   
作者: ux400    时间: 2011-11-30 22:29
本帖最后由 ux400 于 2011-11-30 22:36 编辑
这不是AS400的问题,而是所有系统的问题。AS400也是一样的。
在多线程里,不能多线程共享一个数 ...
yulihua49 发表于 2011-11-29 13:58



我们AS/400上的应用一般不是拿AS/400当ODBC/JDBC数据库服务器用。而是 socket通讯程序(一般用C写) -> 本机CALL RPG应用(直接读写PF)。
这样如果 socket通讯程序用多线程,则RPG应用就不能commit?

要不就不直接CALL 本机RPG应用,通过 DATA QUEUE隔离,即socket通讯程序用多线程写请求入DTAQ1,然后读DTAQ2等待回应;另一进程或多个进程读DTAQ1,CALL 本机RPG应用,回应写入DTAQ2。这样会不会使得DATA QUEUE成为瓶颈?
作者: kkppccdd    时间: 2011-12-01 20:00
5000TPS,應該先考濾OS跟硬件
作者: yulihua49    时间: 2011-12-02 15:24
本帖最后由 yulihua49 于 2011-12-02 15:37 编辑
我们AS/400上的应用一般不是拿AS/400当ODBC/JDBC数据库服务器用。而是 socket通讯程序(一般用C写)  ...
ux400 发表于 2011-11-30 22:29



    RPG不清楚,它是线程安全的吗?如果是,那么是通过句柄访问的吗?如果是,建立句柄池,确保一个句柄最多为一个线程持有即可,多个句柄之间互斥锁操作。
也有不通过句柄,通过语义环境,按语义环境切换线程。

如果不支持多线程,只好DATAQ,操作串行化了,部分的失去了多线程的好处。一个RPG处理能否达到5000TPS很难说了。
不是说DATAQ是否瓶颈,而是RPG处理成了瓶颈。多CPU用不上了,千军万马过独木桥。

现代数据库都是并行设计的,都要考虑大规模并行处理环境,肯定都是支持多线程的。
作者: ux400    时间: 2011-12-02 21:29
RPG不清楚,它是线程安全的吗?如果是,那么是通过句柄访问的吗?如果是,建立句柄池,确保一个句 ...
yulihua49 发表于 2011-12-02 15:24



看这里:
http://www.mcpressonline.com/tip ... -threaded-jobs.html
http://publib.boulder.ibm.com/in ... hw%2Frzahwileco.htm
新的ILE RPG(RPGLE) 也不是十分的线程安全。它不是通过句柄访问的。

AS/400的PF(物理文件) 类似于 DOS 时代的 .DBF, 就是 DB2/400的一个 TABLE , RPG 程序类似于 FoxBase, 当然,RPG程序也可以嵌入 SQL。
作者: ux400    时间: 2011-12-02 21:35
AS/400 上可以跑JAVA,在WEBSPHERE中,它通过 JDBC 连接本机或它机的 DB2/400,是支持多线程的。
作者: yulihua49    时间: 2011-12-03 20:15
本帖最后由 yulihua49 于 2011-12-03 20:17 编辑
AS/400 上可以跑JAVA,在WEBSPHERE中,它通过 JDBC 连接本机或它机的 DB2/400,是支持多线程的。
ux400 发表于 2011-12-02 21:35



    DB2我用过,线程安全。
RPG,看样子还在COBOL时代。所谓线程安全,不过是串行化处理,不具有并行性。
大吞吐量处理,尽快改为现代数据库。
可以前端数据库处理,然后export to RPG File进行后台处理。
作者: bs    时间: 2011-12-03 22:34
想省事的话直接上 zeroMQ吧
作者: ux400    时间: 2011-12-04 20:21
RPG就是比 COBOL 还八股。
学起来麻烦,但是应用效率还是可能比SQL高




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2