监控系统组件
在进行性能监控时,应该监控系统的四个基本组件:
l 处理器检查其利用率及达到了什么样的峰值。
l 内存检查内存被占用量,及其可用量。
l 磁盘检查磁盘空间可用量,磁盘空间是如何被占用的,还有哪些需求需要占用磁盘空间,还需要了解磁盘读取速度(响应时间)。
l 网络检查网络通信的吞吐量、延迟和错误率。
处理器
监控CPU 以确保系统不存在失控进程,并确保CPU 周期在各运行进程中平均分配。要做到这一点,方法之一是调用正在运行的进程列表,然后确定每个进程所占CPU 的百分比。另外一个方法是检测系统进程的平均负载。大多数操作系统提供了CPU 性能的多种视图。进程是指在L.inux 或UNIX 操作系统上运行的一个工作单元。一个程序可能同时运行一个或多个进程。多线程应用程序,如MySQL,通常以多进程的形式出现在操作系统中。
当CPU 处在高性能负载下且争用激烈时,系统将运行缓慢,甚至出现死机情况。在这种情况下必须减少进程的数量或者减少那些消耗较多CPU 时间的进程的CPU 使用率。然而一定要监控CPU,并确认系统问题确实是由CPU 的高使用率导致的——系统运行缓慢更有可能是内存争用导致的,下一节将讨论这个问题。
CPU 超载的一些常见的解决方法是:
提供新服务器运行进程这当然是最好的办法,但是新服务器需要资金。有经验的系统管理员通常可以找到其他的方法去减少CPU 的使用率,尤其是当组织更愿意花时间而不是花钱在这件事情上时。
删除不必要的进程大量系统的后台运行进程可能在某些场合有用,但大多数时候会使系统陷入瘫痪。然而,作为一个系统管理员,必须非常了解操作系统,以确定哪些进程是不必要的。
杀死失控的进程当性能问题间歇地或偶尔出现时,可能是由有缺陷的应用程序导致的,这些失控的进程往往是罪魁祸首。倘若你使用可控的或有序的方法不能够停止失控的进程,可能需要使用强制退出对话框或使用命令行强制性地终止这个进程。
优化应用程序有些应用程序时常会占用超过其实际需要的CPU 时间或其他资源。设计糟糕的SQL语句经常拖累了数据库系统。
较低的进程优先级有些进程可以在后台作业运行,例如报表生成器,而且它们可以运行得更慢,以给互动进程腾出空间。
重新安排进程也许有些报表生成进程可以在系统负荷较低的夜间运行。
占用太多CPU 时间的进程被称为CPU-bound 或processor-bound,这意味着它们不会为等待I/O 暂停自己,也不能被交换出内存。
如果你发现CPU 没有被争用,此时仅有少数几个进程在运行或者不存在消耗大量CPU时间的进程,那么此时很可能是其他地方导致性能问题的发生:如等待磁盘I/O、内存不足、过度页交换等。
内存
监控内存是为了确保应用程序不要请求过多的内存,因为请求过多的内存会浪费系统管理内存的时间。操作系统从最初使用有限的随机存取存储器(RAM 或主内存),已经发展到使用磁盘存储器来存储未使用的部分或主内存页面,这种技术被称为分页或交换,可以存储悬停进程的内存,并在进程被激活时将被存储的内存恢复出来,这样系统在同一时间内比主内存系统负担的进程更多。虽然内存块在内存与磁盘间交换的代价相对较高(与直接访问主内存相比,比较耗时),但是现代操作系统在这方面能够做到很快,那么这种缺陷就不是问题了,除非它无法使处理器和磁盘的运行速度跟上需求。
然而操作系统可能定期回收较高水平的交换内存。一定要测量一段时间内的内存使用率,确保不存在常规清除操作。
在高分页期,内存不足有可能是因为失控进程占用太多的内存或者系统运行了过多的进程以至于占用过多的内存。这种高分页被称为thrashing,与CPU 资源争用类似。消耗过多内存的进程被称为memory-bound。
在处理内存性能问题时,自然想到的处理方法是增加更多的内存。虽然这样可以解决问题,但内存也有可能在各子系统间分配不均匀。
在这种情况下你有几件事情可以做,可以分配不同数量的内存给系统的组件(如内核或文件系统),或者分配不同数量的内存给允许进行内存调整的各种应用程序(如MySQL),还可以更改子系统的分页优先级,这样可以使操作系统更早开始分页。
调整服务器内存子系统时要小心,请务必参考关于提高特定操作系统性能的文档或书籍。
如果在监控内存时发现系统的分页并不频繁,而系统性能仍存在问题,此时,性能问题可能跟其他的子系统有关。
磁盘
监控磁盘使用率是为了确保系统拥有足够的可用磁盘空间且拥有足够的I/O 带宽,以使进程执行时不会出现明显的延时。可以使用per-process 或overall transfer 读取磁盘的传输速率来衡量以上情况。per-process 传输速率是指单个进程可以读写的数据量。overalltransfer 传输速率是指读写磁盘数据的最大带宽。一些有多个磁盘控制器的系统可能单独衡量每个磁盘控制器的overall transfer 传输速率。
如果有一个或更多的进程消耗过多的最大磁盘传输率,将会出现性能问题。这就像进程消耗太多的CPU 周期一样,同样会对系统的其余进程产生不利的影响:它将“饿死”其他进程,迫使它们等待更长的磁盘访问时间。
消耗太多磁盘传输率的进程被称为disk-bound,也就是说它访问磁盘的频率大于磁盘传输率能够提供的份额。如果能够减少disk-bound 进程给I/O 系统带来的压力,将会为其他进程腾出更多的带宽。
一种满足执行大量的磁盘I/O 的进程需要的方法是增加文件系统的块大小,从而使大型传输更有效,这样还可减少由disk-bound 进程带来的系统开销。然而,这可能会使其他进程运行得更慢。
当在只有一个控制器或磁盘的服务器上优化文件系统时需要谨慎行事。请务必参考提高具体操作系统性能的文档或书籍。
如果资源充足,那么可以添加新的磁盘控制器和磁盘阵列来处理磁盘争用,将其中一个disk-bound 进程的相关数据移到新的磁盘控制器上。另一种处理磁盘争的方法是将diskbound进程移到另外一个使用率较低的服务器上。最后一种方法是在某些情况下,通过升级磁盘系统来使系统运行更快,从而增加磁盘的带宽。
至于先从哪里开始优化或者哪种优化方法是最好的,有不同观点。但是我们认为:
如果需要运行大量的进程,就需要扩大磁盘传输速率或将进程分布在不同的磁盘整列或系统上。
如果需要运行少数几个数据访问量大的进程,就需要通过增加文件系统的块大小来增加单个进程的传输速率。
可能需要在这两个解决方案之间取得平衡,通过将有些进程移到其他系统上的方法来满足独特的混合进程(mix of processes)。
网络子系统
监控网络接口以确保系统拥有足够的带宽,并确保正在发送或接收的数据具有高质量。
有些进程试图读写的数据超过网络配置或硬件所允许的范围,以至于它们消耗了过多的网络带宽,这样的进程被称为network-bound。这类进程为了避免自己发生延时而阻止其他进程访问充足的网络带宽。
网络带宽问题通常表现为完全占用网络接口的最大带宽,可以通过给不同进程分配特定网络端口的方式来解决这个问题。
网络数据质量问题通常表现为在网络接口上遭遇大量错误。幸运的是,操作系统和数据传输应用程序通常采用checksumming 或其他一些算法来检测这类错误,但是重发将给网络和操作系统带来沉重负担。解决这个问题可能需要将一些应用程序移到同一网络的其他系统上,或者可能需要安装额外的网卡,而且在改变网络硬件、重新配置网络协议或者将系统移动到网络中不同的子网后,通常需要进行诊断分析。
当提起进程时你可能听到I/O-bound 或I/O-starved 这样的术语。这通常是指进程占用太多的磁盘或网络带宽。
本文节选自《高可用MySQL:构建健壮的数据中心 》一书
图书详细信息:http://bvbroadview.blog.51cto.com/3227029/683625