当前位置: 技术问答>linux和unix
如何提高性能
来源: 互联网 发布时间:2017-01-18
本文导语: 请问各位,如果有这个过程: 链表中有500万到1000万个key。 客户端从内存链表中顺序取得key—>向服务器发送key(同时删除该key)—>服务器返回对应数据—>客户端保存到磁盘中。 如何能大幅提高速度呢?(仅从客户...
请问各位,如果有这个过程:
链表中有500万到1000万个key。
客户端从内存链表中顺序取得key—>向服务器发送key(同时删除该key)—>服务器返回对应数据—>客户端保存到磁盘中。
如何能大幅提高速度呢?(仅从客户端这边考虑)。
我现在是使用单线程,10个小时都完成不了。
链表中有500万到1000万个key。
客户端从内存链表中顺序取得key—>向服务器发送key(同时删除该key)—>服务器返回对应数据—>客户端保存到磁盘中。
如何能大幅提高速度呢?(仅从客户端这边考虑)。
我现在是使用单线程,10个小时都完成不了。
|
什么叫逐个读啊,不就是发请求,读应答么,那你们用epoll的目的是什么。
我有1000个key,我TCP顺序发出去, 另一端顺序处理key,顺序返回value, 我这一边顺序存储value, 这和多线程没什么关系。
写磁盘比较慢的话,可以做内存映射直接操作内存。
如果做成多线程,问题那就大了,客户端根本没有道理做多线程,apache做成线程的worker模式那是可以的,因为它是服务器,它处理的是不同用户的请求。 你是客户端,你打算让哪个线程发送key? 你打算通过N个socket连到服务器? 每个socket负责1000/N个key的写? 那并发写磁盘你能处理好么? 你打算1个socket连到服务器? 那多线程读一个socket还要加锁?
网络I/O现在根本不是瓶颈,一个单线程epoll loop 每秒10/100M流量小意思, 完全看交换机给你提供多少带宽。
多线程模型在现在看来都是垃圾架构,除非特殊应用场景。
楼主面临的问题是写磁盘的压力,因为磁盘I/O慢直接影响到网络I/O速度, 方法就是内存映射。
如果还嫌慢, 这时候多线程的优势就出现了, 把磁盘I/O迁移到一个单独的线程/子进程里, 主线程的网络数据通过管道送给磁盘I/O线程/进程,让它并发的去写,而不是让网络I/O等待磁盘写。