HeZiHang
HeZiHang
IOCP support File IOs. For higher performance, All File RW should use IOCP. Delphi Cross Socket is only focused on network IO, To support File IO and network IO in...
赞同。而且可以避免一些const变量当做局部变量用。
Due to the architectural problem of this framework, out-of-order reception occurs when a large number of packets are received, which is difficult to avoid. Unless each thread has its own...
由于此框架的架构问题,大量包接收时会出现乱序接收现象,这是很难避免。 除非每个线程有各自的Epoll或iocp或kqueue。而且每个Socket绑定在一个io队列(即一个socket所有的IO仅由某一个线程来处理)才能避免粘包现象。
影响CPU性能的关键在于:1.锁的大量使用,2.内核用户态之间上下文切换,3.大量CPU硬件中断响应,4.多核内存访问瓶颈 1.目前架构是1个iocp,由n个线程处理io,需要有大量的锁(包括原子操作)来处理,CPU的花费大量时间在等待中。因此,如果n个线程各有各的iocp,即n个CPU有n个线程,每个线程有各自的iocp,这样各线程处理自己的io,各io不与其他线程相关,则可以不用锁,可以大大减少锁的使用,极大提高性能。 2.每个线程可以绑定在一个CPU核上运行,不会被调度到其他CPU,这样能够进一步提高效率。 3.如果每个CPU有独立的物理内存,那么就可以减少内存访问时间,提高效率。这个需要CPU支持NUMA架构。还不清楚Windows是否支持Numa。但我们可以先为每个线程提供独立的内存。 3.由于内存管理器中是线程安全,所以里面也有很多锁的存在,因此如果每个线程处理自己的io,那么如果每个线程有自己的内存管理器,或者是每个线程有自己的内存池不用内存管理器,那么还能进一步提升性能。 4.如果需要进一步性能,需要在用户态(Ring3)中进行硬件(网卡)操作,绕开CPU的中断及内核用户态切换的花销。这个Windows可能做不到,但可以通过驱动程序提供硬件访问,由用户态进行网卡操作。 5.如果所有的这些优化措施都能做到,可以单机性能到百万级别并发。(可百度dptk)
由于Delphi-Cross-Socket中使用的默认内存管理器,而且里面大量使用了String,Delphi的String是需要经常进行内存申请和释放操作,因此如果多个线程不停的使用不定长度的String,时间长了,可能会造成大量碎片内存。
都可以。
@winddriver 我最近也没有大块时间,我们可以慢慢来,定义一个路线图。 比如: 1.建立2.0分支版本, 2.定义一个新的内存管理器,各线程独立的内存管理。 3.定义无锁循环队列,用于线程间发送消息,传递数据。 4.定义一个线程变量模型,可参考Spring中的线程变量 5.修改为每个线程对应一个io队列。