提高服务器程序性能的一些方法

1. 锁的使用

锁是影响服务器程序性能的第一大杀手。服务器程序一般都是多线程或是多线程的,锁肯定避免不了。对于锁的使用,第一点就是减小锁的粒度。比如mysql有行锁,表锁,各种粒度不同的锁。在需要加锁的地方,选择粒度最小的锁。第二点,使用一些高性能的锁,比如读写锁,自旋锁。这个要根据具体的应用场景来选择。另外还有一些应用级别的锁,比如电商系统里面,用来减库存的乐观锁,与其对应的则是悲观锁。另外,还可以通过优化代码,来达到无锁化操作。

2. 内存使用

在一个内存操作密集型的服务器程序上,对内存的使用优化肯定也是必不可少的。首先,是使用内存池,来避免内存的频繁申请与释放。其次,减少不必要的memset与memcpy。比如,我们的流媒体服务器,发送媒体流的过程就是一个不断申请释放内存的操作。对于申请的内存,我们就没必要给它清零,因为发送的时候,都会指定发送长度。申请的内存使用了多少,就发送多少,不需要上来就清零。对于内存拷贝而言,比如我们在写网络程序时,socket收到的数据包会读到一块缓存里面,那么在解析的时候,尽量不要再将数据拷贝到另一块内存上解析。我们还可以自己实现memcpy等函数,利用cpu的特性,每次操作4个字节或是8个字节,根据操作系统的位数决定。还有就是尽量减少用户空间与内核空间的内存拷贝操作,比如使用一些零拷贝的函数,sendfile ,mmap等

3. 多线程

服务器程序,应该禁止动态创建线程。所有的线程应该在程序初始化时就创建,直至程序运行结束。当然也有一些场景,可以惰性化开启。比如在业务第一次触发时,开启相应线程,之后就不需要再关闭了。对于线程池的使用,要选择合理的线程个数。线程太小,无法发挥处理器的多核优势;线程太多,系统会消耗很多性能在线程切换上。一般来说,线程的数量是处理器核心数量的两倍

4. 网络

高并发离不开网络性能,I/O密集型的程序,linux上使用epoll, bsd上的kquene,windows有iocp,这些就不细讲了,之前的博文中有介绍

5.异步化

服务器之间相互依赖的接口,尽量实现成异步的,这样就不需要阻塞调用线程,减少因为网络原因引起的等待

6.与客户端的交互

所有的服务器都给客户端提供服务,应该尽量减少与客户端的交互过程。即做到在每次交互中,处理更多的事情。比如我们自己实现的流媒体服务器,刚开始点播流的时候,要发一些信令报文。之前我们需要三次交互,才能开始发流,后来通过消息合并,节省了一步。不要小看这一小步,在网络不好的情况下,可能就会减少很多点播时延

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏企鹅号快讯

如何提升Java应用程序性能

作者 | Eugen Paraschiv 翻译 | 雁惊寒 【摘要】本文首先介绍了负载测试、基于APM工具的应用程序和服务器监控,随后介绍了编写高性能Java代...

2498
来自专栏IT可乐

Linux系列教程(三)——Linux学习技巧

  前面我们讲了Linux系统的详细安装教程,大家跟着教程一步一步的操作,应该能完美的完成安装。那么这篇博客跟大家聊聊如何来学习Linux。 1、工欲善其事必先...

2627
来自专栏EAWorld

微服务架构下分布式Session管理

一、应用架构变迁下的Session管理 1.1 单体架构 1.2 分布式架构 1.3 微服务架构 二、微服务架构下分布...

4598
来自专栏九彩拼盘的叨叨叨

node.js 第三方模块

3833
来自专栏Linyb极客之路

高并发之缓存

应用需要支撑大量并发量,但数据库的性能有限,所以使用缓存来减少数据库压力与提高访问性能。

1932
来自专栏EAWorld

微服务架构下的分布式Session管理(PPT详解)

大家好,很高兴在这里和大家进行微课堂的分享,今天进行分享的主题是《微服务架构下的分布式Session管理》。 主要大纲: 一、应用架构变迁下的Session管理...

72414
来自专栏java一日一条

Spring 测试:其实很简单

在过去的职业生涯里,我经常发现有些人不写测试代码,而他们声称不写的理由是无法轻易地写出覆盖多个不同模块的测试用例。好吧,我相信他们中的大部分要么是缺乏一些比较易...

2292
来自专栏Android-JessYan

MVPArms官方首发一键生成组件化,体验纯傻瓜式组件化开发

原文地址: https://www.jianshu.com/p/2452ea776a45

2573
来自专栏云计算教程系列

如何在CentOS 7上使用Pacemaker建立Apache主动 - 被动群集

高可用性是当今的一个重要主题,因为服务中断可能非常昂贵。谨慎采取措施,以便在发生中断时保持您的网站或Web应用程序正常运行。使用Pacemaker堆栈,您可以配...

890
来自专栏Linyb极客之路

SpringCloud微服务(原理篇)

微服务的模式和形式我在前面已经进行部分的提及,但是一直没落实到技术层面,这段时间我也在次研究了一下微服务,下面我先贴出SpringCloud整体涉及的结构

1194

扫码关注云+社区

领取腾讯云代金券