服务器程序设计的一点体会

服务器程序设计的一点体会

一个高效,稳定的服务器对于项目的成功至关重要,是不间断地对用户提供服务,创造美好
体验的关键。而架构良好服务器程序需要良好的程序功底,需要处理好几个方面的问题。

并发问题

现在服务器程序都是跑在多核,甚至多CPU主机上,如果充分利用强大的CPU是程序员面对的挑战。
现在主要使用线程池技术,程序启动时创建好特定数量的线程,使其能够并发处理接收到的请求,
以此利用多核CPU,提高系统吞吐量。但同时也引入了并发性问题,给程序构造带来复杂性,不得
不引入锁,这也要求合理的利用锁,注意锁的方式和范围,使锁对性能的开销降到最低。

另外,也通常将服务器功能分散到多个Server上,既多进程,如此每个Server可以单独设计,简化
了实现的难度,同时一部分服务器宕机时不至于影响其他服务。但是多Server的方式也有弊端:
系统调试困难,网络环境并不是总是可靠,正确高效管理多个连接对程序员也是挑战,部署困难等,
同时Server之间太多的Round Trip对性能的影响也不容小觑!

内存问题

对于使用托管代码(Manage Code,像Java, C#)写的服务器一般没有这个方面的问题,而使用本地代码
(Native Code,主要是C/C++)写的服务器,内存问题对于很多程序员都是一场噩梦,没有因内存问题
而吃大苦头的程序员也不算真正强大。主要有几种方法:使用内存池技术,避免过于频繁地向系统
申请和释放小块的内存,造成大量的内存碎片;对于内存泄露,有专门的检查工具,比如Win32的
umdh, 可以清晰显示出某段时间内申请的内存是由那些调用栈申请的,这对于检查Memory Leak
非常重要;对于内存的越界访问,只有提高程序员的自身专业素质了。

IO问题

IO最容易程序服务器程序的性能瓶颈,特别是对于经验不足的服务器程序员。完成良好的IO处理模块
着实不易。对于网络IO,Win32提供了完成端口(completion port), Linux提供了select, pool, epool
等机制,这些都可以用来处理大量的网络接入,得到很高的数据吞吐量,特别是Win32提供的完成端口
机制,可谓是绝佳的处理网络IO的机制,同时配之于网络连接池机制,IO问题可迎刃而解;对于数据库IO,
一般使用数据库连接池机制,避免每次数据库操作都要建立数据库连接,以此提高性能,同时优化业务
逻辑和SQL语句;服务器程序一般不会大量地写文件,因为数据库比文件更优越,如果日志数据要写入文件,
可以采用异步的方式,使日志信息进入队列,再由一个单独的线程把日志最终写入文件,从而不影响
工作线程。

容错处理

服务器程序遇到错误时要自我恢复,要以合理的方式报告给请求者,并且不能影响后续的请求。在多
Server的情况下,每一个Server都不能太依赖于其他Server,永远不能相信其他Server总是能正常的
工作。发往其他Server的请求,需要建立重试和超时机制。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值