总结服务器支撑技术(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分散要考虑局部性。

但单纯增加服务器的数量还是无法保证可扩展性

原因是如果增加了服务器,但是无法缓存的比例仍然不变,那么就会再次成为瓶颈。那么该如何是好呢?

这时就是要用到了局部性的分布式,

关于局部性的原理有很多,这里就不在重复,因为目前自己也还没有真正用到这种分布式的分割方式,所以也不要在这里瞎总结

这部分最终的话,需要学好负载均衡和操作系统的运行原理,更加深入了解操作系统的缓存、多线程、多进程、虚拟内存机制、文件系统等各机制,为了使硬件能有效地发挥作用,配备了何种架构,以及擅长什么、不擅长什么等。此外,还能清楚地理解,要调查负载需要操作系统内部哪些信息。明白这些之后,就能根据操作系统的擅长和不擅长之处,对系统整体进行优化。

相关推荐