服务器开发,有些有用的建议如设置linger减少连接

转载 2011年01月18日 18:45:00

协议设计原则:

第一条 使用文本协议, 尽量使用http协议;(文本协议利于调试和测试,也利于脚本使用, http协议成熟,比较多工具支持)
第二条 如果效率成为问题,可以在实现了文本协议之后,支持二进制协议;(这样程序的BUG可以用文本协议及早发现,后来调试也更方便);
第三条 选择二进制协议时(protocal_buffer, memcache协议, MessagePack),考虑脚本语言的兼容性(ruby, python可否使用),如果自己定义二进制协议,必须实现 ruby, python 的接口,这样方便以后调试和测试。

 

非 阻塞IO和多路分发(epoll),一开始可以使用LT模式,这样程序更容易实现些,后期可以改成ET模式。
ET模式要求一定要读完数据,所以缓存要考虑清楚,例如最大长度,超过就要丢弃请求(RESET或返回错误).


如果有的操作会阻塞,比如数据库操作,文件操 作,mmap, 那就用多线程。这样前端就是异步,后端就是同步的,简称半同步半异步。

用mutrace, 或valgrind 检测程序的mutex和rw_lock 会不会有大量 contention, 如果有的话,减小锁粒度或使用无锁算法(比如circle buffer, RCU, MS-queue).

 

多线程需要队列配合,如果线程是不会长时间休眠的,可以 每个线程都有一个队列,

但如果线程会长时间休眠,就需要使用一个线程组一个队列,线程每次从线程组的队列中取消,

这样可以避免因为线程休眠导致的任务阻塞(就是一个线程持有多个任务,但它休眠了,其它线程没有任务,有CPU也没办法抢到任务).

 

 

整数操作,尽量用atomic_interger operator, 不要去加锁。

 

大 量false的成员查找,可以使用 bloomfilter把 false成员挡掉,从而免去查询cache和数据的开销。
(例如 有3亿用户,但只有1千万有头像,那么用bloomfilter过滤掉 99%的用户访问,cache只要承受1%的压力,
这时只 要两个hash就可以了,我使用的是bobhash和 time33)

 

适当使用无锁算法(失败-重做原则)


一 个请求,不要跨越太多的线程处理,因为线程调度和同步需要比较多的时间,这会带来比较大的时延。

减少内存拷贝,可以参考Linux的 sk_buffer实现

减小锁粒度,例如容器操作,可以先swap后操作,这样只要在swap操作的时候加锁,后续操作可以不用加锁。

critical_section 和 spin_lock 可以省去陷入内核的时间,但是如果线程在 获得锁的时候被休眠了,那么其它线程就会白白浪费cpu.

 

服 务器最好主动关闭连接,如果客户端能确保主动关闭,那么可以考虑被动关闭来节省资源。 不然被动关闭需要超时机制来保证socket会被关闭掉。

主 动关闭会导致大量的 TimeWait,如果是socket异常,会客户端不合要求的请求,可以考虑用linger选项来 reset连接,从而节约服务器资源。

linger(onoff=1, linger = 0)会导致RESET包,无论是主动关闭还是被动关闭,也不管数据包有没有发送完.(shutdown函数不受影响)

http 的 header 可以用vector或固定几个变量来保存,不要使用 map<string,string>, 因为map<string,string>的insert和find效率都比较低。
编译时使用 -O2选项,这样可以提高 10-20%的效率。


用 g++ -pg 和 gprof 来剖析CPU性能问题, Oprofile 来进行更深入的剖析(L1 L2 Cache)。

 
内存泄露问题用 valgrind加上 ab 压力测试一段时间,就可以看出泄露部分。

 

CPU 100% 问题 gdb 随机断点几次,用 bt看堆栈基本可以看出,还可以使用 gprof 来看哪个函数占了最多的cpu。

 

strace 可以跟踪系统调用,和调用占用的时间,这个可以用来查进程休眠时间问题(CPU占用低,进程经常休眠)。

 

压力测试可以使用 ab, httperf, autobench。
功能测试:selenium


测试出系统性能曲线后,就要限 制前端的接入数量,保证系统高效。(接入过多,反而拖累系统,但也要考虑并发数的问题,所以要在吞吐和并发数之间折中)。


多路分 发的方式:
1. libevent, 使用c接口,这样可以分发到任意函数。(效率最高,灵活性大)
2. 通过虚函数分发。这个的缺点是,不能分发到不同函数。(最多人这么实现)

3. boost的 asio方式分发,使用function和bind对象来定制分发函数。(灵活性最大)

socket跟TCP/IP 的关系,单台服务器上的并发TCP连接数可以有多少

常识一:文件句柄限制 在linux下编写网络服务器程序的朋友肯定都知道每一个tcp连接都要占一个文件描述符,一旦这个文件描述符使用完了,新的连接到来返回给我们的错误是“Socket/File:Can'...
  • huangjin0507
  • huangjin0507
  • 2016年09月01日 10:04
  • 9426

怎么保证远程登录服务器安全

远程登录进行服务器的管理和维护是管理员的日常工作之一,如何保障远登录的安全性也是大家必须要考虑的问题。本文将从帐户管理和登录工具的安全部署两个方面入手,谈谈如何实现服务的安全登录。   一、严密...
  • sunfor
  • sunfor
  • 2013年03月08日 14:57
  • 6332

关于前端和后台服务器协调开发的几点建议

其实手机端开发说白了就是前端的开发,做了前端开发也有段时间了。在自己的工作过程中,免不了和后台打交道。这就有一个弊端:很多时候后台的一些工作计划或者活动,或多或少的会给前台造成影响。下面我举几个我平时...
  • liufangbaishi2014
  • liufangbaishi2014
  • 2015年12月07日 14:08
  • 1545

setsockopt 设置 SO_LINGER 选项 关闭连接

setsockopt 设置 SO_LINGER 选项 关闭连接 2012-08-12 11:12:44 分类: WINDOWS setsockopt :SO_L...
  • jiafu1115
  • jiafu1115
  • 2016年02月19日 09:37
  • 268

对新手有用的JavaScript开发小建议

这篇文章将向你分享一些不为人知的但很有用的JavaScript小建议,对那些刚涉及使用JavaScript编程语言的初级开发者应该有很大的帮助。   1. 用数组长度截取数组   ...
  • owen5630
  • owen5630
  • 2014年01月21日 13:30
  • 11325

对新手有用的JavaScript开发小建议

这篇文章将向你分享一些不为人知的但很有用的JavaScript小建议,对那些刚涉及使用JavaScript编程语言的初级开发者应该有很大的帮助。 1. 用数组长度截取数组 我们都知...
  • zyb_icanplay7
  • zyb_icanplay7
  • 2014年02月28日 10:05
  • 405

tcp的关闭(shutdonw、close、SO_LINGER选项)与 连接断开情形判断

1.close只是减少引用计数,只有当引用计数为0的时候,才发送fin,真正关闭连接 shutdown不同,只要以SHUT_WR/SHUT_RDWR方式调用即发送FIN包 2.对方关闭读,再对其写,写...
  • le119126
  • le119126
  • 2015年10月21日 10:29
  • 902

tcp短连接TIME_WAIT问题解决方法大全(2)——SO_LINGER

SO_LINGER是一个socket选项,通过setsockopt API进行设置,使用起来比较简单,但其实现机制比较复杂,且字面意思上比较难理解。 解释最清楚的当属《Unix网络编程卷1》中的说明(...
  • yah99_wolf
  • yah99_wolf
  • 2012年11月04日 21:48
  • 10641

TCP异常终止连接及SO_LINGER选项

TCP的异常终止连接及SO_LINGER选项:终止一个连接的正常方式是一方发送FIN,进入FIN_WAIT1状态。当我们调用close()函数关闭连接之后,如果在发送缓冲区中还有数据,那么系统会发送这...
  • Move_now
  • Move_now
  • 2017年03月12日 12:42
  • 390

TCP的选项SO_LINGER设置延时关闭

SO_LINGER这个选项在我以前带队改造haproxy的时候引出过一个reset(RST)客户端连接的bug。 SO_LINGER作用 设置函数close()关闭TCP连接时的行为。缺省cl...
  • xiongping_
  • xiongping_
  • 2015年05月25日 09:46
  • 578
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:服务器开发,有些有用的建议如设置linger减少连接
举报原因:
原因补充:

(最多只允许输入30个字)