如何设计高并发服务器-操作系统层面

高并发服务器

问题 : 假如设计千万级的并发程序,需要多少内存?

1 操作系统要求

1.1 内存

操作系统在默认设置下,为每个TCP 连接分配4k的读内存(rmem)和4k的写内存(wmem),那么一个连接需要8k的内存,1kw连接则需要80G内存。

修改操作:

sysctl -w net.ipv4.tcp_rmem=4096
sysctl -w net.ipv4.tcp_wmem=4096
1.2 文件描述符

文件描述符是一个打开文件的索引,找到文件描述表,再找到i-node表,文件描述符也是一种资源,像端口一样,也有数量限制。

1.查看限制
1.ulimit -n 用户级别查看
2.sysctl -a | grep -i file-max --color; 系统级别查看
1.临时修改,用户登陆时生效
ulimit -SHn 10485760 用户级别修改
sysctl -w fs.file-max= 10485760 
2.永久修改
/etc/security/limits.conf  最后一行加入 * - nofile 10485760 用户级别修改
/etc/sysctl.conf 加入 fs.file-max=10485760 然后执行 sysctl -p  系统级别修改
1.3 单进程的文件数量限制

由于单进程的文件数量限制最大值只能到1048576(百万),应当修改

echo ‘* soft nofile 1048576’ >> /etc/security/limits.conf #用户单进程的最大文件数,用户登录时生效
echo ‘* hard nofile 1048576’ >> /etc/security/limits.conf #用户单进程的最大文件数,用户登录时生效
ulimit -n 1048576 #用户单进程的最大文件数 当前会话生效

由于一个进程最多能够打开100w个文件,因此需要多进程来支持千万连接,因此server需要运行多个(10个进程满足千万级需求)服务器进程。

1.4 CPU
  • 当然,CPU越高端越好,CPU越快,应用的性能一定越好,不过CPU和应用性能提升可能不成线性增长的关系,因为应用可能是IO密集型,应用性能还会受到IO阻塞的影响。
  • 如果只是考虑应用对CPU利用效率的话: 单核>=多核>=多服务器
  • 单进程单线程的系统对于服务器资源的利用率更高。
  • 在多核的系统中,就会因为锁的问题,多任务同步的问题,操作系统调度的问题,造成一定的资源浪费。在分布式系统中,这些浪费也会更严重。
  • 避免因为IO阻塞让CPU闲置,导致CPU的浪费;
  • 避免多线程间增加锁来保证同步,导致并行系统串行化;
  • 避免创建、销毁、维护太多进程、线程,导致操作系统浪费资源在调度上;
  • 避免分布式系统中多服务器的关联,比如:依赖同一个mysql,程序逻辑中使用分布式锁,导致瓶颈在mysql,分布式又变成串行化运算。
1.5 最后

高并发和高性能是紧密相关的,提高应用的性能,是肯定可以提高系统的并发能力的。

应用性能优化的时候,对于计算密集型和IO密集型还是有很大差别,需要分开来考虑。

计算密集型任务的特点是要进行大量的计算,消耗CPU资源,比如计算圆周率、对视频进行高清解码等等,全靠CPU的运算能力。这种计算密集型任务虽然也可以用多任务完成,但是任务越多,花在任务切换的时间就越多,CPU执行任务的效率就越低,所以,要最高效地利用CPU,计算密集型任务同时进行的数量应当等于CPU的核心数。
计算密集型任务由于主要消耗CPU资源,因此,代码运行效率至关重要。Python这样的脚本语言运行效率很低,完全不适合计算密集型任务。对于计算密集型任务,最好用C语言编写。

IO密集型,涉及到网络、磁盘IO的任务都是IO密集型任务,这类任务的特点是CPU消耗很少,任务的大部分时间都在等待IO操作完成(因为IO的速度远远低于CPU和内存的速度)。对于IO密集型任务,任务越多,CPU效率越高,但也有一个限度。常见的大部分任务都是IO密集型任务,比如Web应用。
IO密集型任务执行期间,90%以上的时间都花在IO上,花在CPU上的时间很少,因此,用运行速度极快的C语言替换用Python这样运行速度极低的脚本语言,完全无法提升运行效率。对于IO密集型任务,最合适的语言就是开发效率最高(代码量最少)的语言,脚本语言是首选,C语言最差。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值