总结服务器支撑技术(Linux)
如何解决负载均衡,首先需要找到问题短原因,这里总结几点:
第一:不要推测,要测量。要想把服务器的性能发挥到极致,首先要正确掌握服务器资源短使用状况。
第二:如何寻找瓶颈点,分为两个步骤(查看平均负载和确认CPU、I/O有无瓶颈
第一步查看负载就是用top、uptime等命令显示平均负载
第二步查看CPU和I/O瓶颈,通过sar或者vmstat命令来查看(一般分为计算密集型和I/O密集型)
CPU负载个人认为一种是计算导致,一种就是线程死锁导致,前者属于业务逻辑处理问题,后者是线程安全问题
I/O比较简单就是是否有过多的I/O请求,或者是频繁的磁盘交换(程序是否利用到操作系统的缓存机制)
当是单CPU的时候,操作系统其实是共享CPU的方式达到看似在同时执行多个任务,内部是在极短的时间内切换多个任务并执行处理。
其中top命令的输出:load average(平均负载)
load average:0.70, 0.66, 0.59
平均负载从左到右分别是1分钟、5分钟、15分钟内,单位时间中处于等待状态短任务数
平均负载揭示的实际负载状况,它是两种负载综合的结果,单凭数字是无法判断是CPU负载高还是I/O负载高。最终需要更细致的调查
就是通过sar查看CPU的使用率和I/O等待率
sar -P 可以查看多个CPU的使用情况,
命令行如下;
sar -P ALL | head -13 或者 sar -P ALL | head
linux只要有空闲内存,就会全部缓存。这一点没有任何限制,命令sar -r l表示每秒输出一次当前的内存状态。命令的输出结果
中kdcached即为用于缓存的容量,memused表示内存的使用量,
例如kdcached值为694088,memused值为99.71,要是不知道页面缓存原理,会误认为我的电脑内存完全不够用啊,其实有接近700多MB的缓存。
增加内存其实就是降低了I/O负载,主要是sar命令的结果中iowait这个指标进行观察,当加大内存后,会很明显降低I/O的等待时间
sar有两种用法;
追溯过去的统计数据(默认)
周期性地查看当前数据
例如:sar 1 3表示一秒一次,过3次
sar -f /var/log/sa/sa05 表示读取指定目录下的日志文件
下面简单总结下sar的命令用法
sar -u 查看CPU的使用率(也是默认的显示方式)结果中的各列指标信息说明如下:
%user 用户模式下消耗的CPU时间的比例
%nice 通过nice改变了进程调度优先级的进程,在用户模式下消耗的CPU时间的比例
%system系统模式下消耗CPU时间的比例
%iowait CPU等待磁盘I/O而导致空闲状态消耗时间的比例
%steal 利用Xen等操作系统虚拟化技术时,等待其他虚拟CPU计算占用的时间比例
%idle CPU没有等待磁盘I/O等的空闲状态消耗的时间比咧
在考虑负载均衡时,user/system/iowait/idle值是重要的指标
sar -q 查看平均负载,能查看到运行队列中的进程数、系统上的进程大小、平均负载值(1分钟、5分钟、15分钟)
sar -r 查看内存使用情况,结果各列说明:
kbmemfree: 空闲物理内存量
kbmemused: 使用中的物理内存量
%memused: 物理内存使用率
kbbuffers: 内核中作为缓冲区使用的物理内存容量
kbcached: 内核中作为缓存使用的物理内存容量
kbswpfree: 交换区的空闲容量
kbswpused: 使用中的交换区容量
sar -W 查看页面交换发生状况,结果各列说明:
pswpin/s 表示1秒内的换入页面数
pswpout/s 正好相反,为换出页面数
当出现频繁的页面交换时,服务器的吞吐量就会大幅下降。
这里做个小的总结就是Linux的页面缓存行为,要记住”只要可能,Linux就会把空闲内存作为页面缓存使用“的策略(并且Linux以4KB的小块来管理内存空间)。也就是说,
从磁盘读取数据
如果数据在页面缓存中不存在
并且有空闲内存的话
就建立新的缓存(而不是替换旧缓存)
当没有空闲内存供缓存使用时,才用新缓存替换旧缓存。
以缓存为前提降低I/O负载策略:
如果数据规模小于物理内存,就全部缓存
考虑与经济成本的平衡性
但是只增加内存就能全部缓存的话当然最好,但是数据规模肯定会有无法全部缓存的那一天。那时怎么办呢?首先就要考虑扩展到多台服务器。这里有个策略就是如果缓存不过来的话,扩展到多台服务器上,CPU负载分散只需简单地增加,但I/O分散要考虑局部性。
但单纯增加服务器的数量还是无法保证可扩展性
原因是如果增加了服务器,但是无法缓存的比例仍然不变,那么就会再次成为瓶颈。那么该如何是好呢?
这时就是要用到了局部性的分布式,
关于局部性的原理有很多,这里就不在重复,因为目前自己也还没有真正用到这种分布式的分割方式,所以也不要在这里瞎总结
这部分最终的话,需要学好负载均衡和操作系统的运行原理,更加深入了解操作系统的缓存、多线程、多进程、虚拟内存机制、文件系统等各机制,为了使硬件能有效地发挥作用,配备了何种架构,以及擅长什么、不擅长什么等。此外,还能清楚地理解,要调查负载需要操作系统内部哪些信息。明白这些之后,就能根据操作系统的擅长和不擅长之处,对系统整体进行优化。