微信号批发,巴东一中,宝岛规律王
应用程序通过访问磁盘来读取数据,而磁盘i/o 通常都是很耗时间的,所以一般我们来判断i/o是否有瓶颈的时候,就需要一些参数指标来参考。
通常提升i/o性能的方法有:
(磁盘数 * 每块磁盘的iops)/(磁盘的吞吐量 + raid因子 * 磁盘读写的吞吐量)=iops
这个公式的详情请自行百度。
raid 策略 以及说明
磁盘阵列 | 说明 |
raid 0 | 数据被平均写到多个磁盘阵列中,写和读数据都是平行的,所以磁盘的iops可以提升一倍 |
raid 1 |
raid 1 的主要作用是能够提高数据的安全性,它将一份数据分别复制到多个磁盘阵列中,并不能 提升iops ,但是相同的数据有多个备份。通常用于对数据安全性较高的场合中。 |
raid 5 | 这种设计方式是前两种的折中方式,它将信息平均写到所有磁盘阵列总数减一的磁盘中,往另外 一个磁盘写入这份数据的奇偶检验信息。如果其中有一个磁盘损坏,就可以通过其他磁盘的数据和 这个数据的奇偶检验信息来恢复这份数据。 |
raid 0+1 | 就如名字一样,根据数据的备份情况进行分组,一份数据同时写到多个备份磁盘中,同时多个磁盘也会进行读写。 |
我们知道要建立一个tcp连接,就必须要知道对方的ip 和一个未被使用的端口号,由于32位操作系统的端口号通常是由两个字节表示,所以就只有2^65535个端口号。所以说,一台主机能够建立的连接是有限的。还有 0~1024 端口是受保护的,像80,22,21 这些端口都不是能够被随意占用的。
在linux 中 我们通过查看 /proc/sys/net/ipv4/ip_local_port_range 文件来查看当前能够使用的端口范围, 如果可分配的端口较少,在遇到大量的并发请求的时候就会成为瓶颈。由于端口有限导致大量的请求等待连接,这样性能就会压不上去。 另外 如果发现有大量的time_wait 的话,可以设置 /proc/sys/nettcp_fin_timeout 为更小的值来快速释放请求。
网络参数 | 说明 |
echo "1024 65535">/proc/sys/net/ipv4/ip_local_port_rang | 设置向外连接可用端口范围 |
echo 1 >/proc/sys/net/ipv4/tcp_tw_reuse | 设置 time_wait 连接重用 |
echo 1 >/proc/sys/net/ipv4/tcp_tw_recycle | 设置快速回收 time_wait 连接 |
echo 180000 >/proc/sys/net/ipv4/tcp_max_tw_buckets | 设置最大time_wait 连接长度 |
echo 0 > /proc/sys/net/ipv4/tcp_timestamps | 表示是否启用以一种比超时重发更精确的方法来启用对rtt的计算 |
echo 1>/proc/sys/net/ipv4/tcp_window_scaling | 设置tcp/ip会话的滑动窗口大小是否可变 |
echo 20000 >/proc/sys/net/ipv4/tcp_max_syn_backlog | 设置最大等待处于客户端还没有应答回来的连接数 |
echo 10000 >/proc/sys/net/core/somaxconn | 设置每一个处于监听状态的端口监听队列的长度 |
echo 10000 > /proc/sys/net/core/netdev_max_backlog | 设置最大等待cpu处理的包的数目 |
echo 2000000>/proc/sys/fs/file-max | 设置最大打开文件数 |
echo 15>/proc/sys/net/ipv4/tcp_fin_timeout | 设置fin-wait-2状态等待回收时间 |
echo 16777216 >/proc/sys/net/core/rmem_max |
设置最大的系统套接字数据接收缓冲大小 |
echo 262144 > /proc/sys/net/core/rmem_default | 设置默认的系统套接字数据接收缓冲大小 |
echo 16777216 >/proc/sys/net/core/wmen_max | 设置最大的系统套接字数据发送缓冲大小 |
echo 262144 >/proc/sys/net/core/wmen_default | 设置默认的系统套接字数据发送缓冲大小 |
echo "4096 87380 16777216" > /proc/sys/net/ipv4/tcp_rmem | 设置最大的tcp 数据发送缓冲大小,三个值分别是 最小,默认,和最大值 |
echo "4096 65535 16777216"/proc/sys/net/ipv4/tcp_wmem | 设置默认的tcp数据接收缓冲大小,三个值分别是 最小,默认,和最大值 |
调优参数
以上的设置都是临时的,系统重启之后会自动丢失, linux 还提供其他查看当前tcp 统计的信息
网络i/o 优化的基本处理原则。
同步的思想是:所有的操作都做完,才返回给用户。这样用户在线等待的时间太长,给用户一种卡死了的感觉(就是系统迁移中,点击了迁移,界面就不动了,但是程序还在执行,卡死了的感觉)。这种情况下,用户不能关闭界面,如果关闭了,即迁移程序就中断了。 同步是一种很可靠的任务序列,要么都成功,要么都失败。
将用户请求放入消息队列,并反馈给用户,系统迁移程序已经启动,你可以关闭浏览器了。然后程序再慢慢地去写入数据库去。这就是异步。但是用户没有卡死的感觉,会告诉你,你的请求系统已经响应了。你可以关闭界面了。 异步 是一种不可靠的任务序列。
阻塞与非阻塞主要是从cpu的消耗上来说的,阻塞就是cpu停下来等待一个慢的操作完成以后,cpu 才接着完成其他工作。 非阻塞就是在这个慢的操作执行时,cpu去做其他地方工作,等这个操作完成时cpu再接着完成后续操作。 虽然从表面上看,非阻塞的方式可以明显的提高cpu的利用率,但是也带来另一种结果,就是系统的线程切换增加。增加的cpu 使用时间能不能补偿系统的切换成本就需要好好的评估。
组合的方式有四种,分别是同步阻塞,同步非阻塞,异步阻塞,异步非阻塞,四种方式都对i/o性能有影响。
组合方式 | 性能分析 |
同步阻塞 | 最常用的一种用法,使用也是最简单的,但是i/o性能一般很差,cpu 大部分处于空闲状态 |
同步非阻塞 | 提升i/o性能的常用手段,就是将i/o阻塞改成非阻塞的方式,尤其是在网络i/o是长连接同时传输数据也不是很多 的情况下,提升性能非常有效。 这种方式通常能提升i/o性能,但是会增加cpu 消耗,要考虑增加的i/o性能能不能补偿cpu 的消耗,也就是系统 的瓶颈是在cpu上还是i/o上。 |
异步阻塞 |
这种方式在分布式数据库上经常用到,比如,在一个分布式数据库中写一条记录,通常会有一份是同步阻塞的的记录 异步阻塞对网络 i/o 能够提升效率,尤其是像上面说的,能够同时写多份相同的数据的情况。 |
异步非阻塞 | 这种组合方式用起来比较复杂,只有在一些非常复杂的分布式情况下使用,集群之间的消息同步机制一般都采用这种 i/o 组合形式, 它适合同时要传很多份相同的数据到集群中不同的机器。同时数据的传输量虽然不大,却非常繁琐的情况,这种网络 i/o用这种方式性能能达到最高。 |
四种组合方式以及性能分析
虽然异步和非阻塞能够提升i/o 的性能,但是也会带来一些额外的性能成本,比如:会增加线程数量从而增加cpu的消耗,同时也会导致程序设计复杂度的上升。如果设计得不好,反而会导致性能下降。所以在实际应用时要根据应用场景综合评估。
如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复
浅析我对 String、StringBuilder、StringBuffer 的理解
使用IDEA搭建SSM框架的详细教程(spring + springMVC +MyBatis)
Springboot整合freemarker 404问题解决方案
引入mybatis-plus报 Invalid bound statement错误问题的解决方法
网友评论