系统优化应该是一个老生常谈的话题了。
不管你用的是Linux、Windows还是一些小型机用的Unix系统亦或其它系统,优化这个话题几乎是永远避不开的。
永远没有最快只有更快,人类对效率的苛求是贪婪的,当然这也是人类技术进步的重要原动力之一。
优化究竟应该怎么样优化呢?优化有没有一些原则或者判断标准的,答案是肯定的。
首先我们必须先明确一个问题,我们优化是在优化什么?优化是有着对象和目标的,如果抛开对象和目标来谈的话优化几乎是一个没头没尾的伪命题。回想一下,在什么情况下我们会将“优化”一个词脱口而出?很多朋友估计也有类似的体会,那就是,在我们对系统目前的情况不满意或者不满足的时候。而这些情况通常包括两个大的方面,一个是时间,一个是空间。我们无非是对这两种东西中的一种或者两种当前状况不满。我们几乎找不到第三种东西来用来衡量。而用来支持这两个方面的因素,譬如CPU、内存、磁盘、网络,这些因素我们称之为资源。
一半来说我们在做优化之前先要做一件事,就是做一个判断,判断一下究竟是资源不足,还是资源分配不合理。
常见的场景可能有以下这些,例如,一个进程在服务器上运行,但是速度确实比我们期望的慢,而CPU和磁盘的带宽缺大量闲置,这种情况下很显然是资源配置不合理。因为资源不是不够,而是由于线程调度,或者算法,或者其它一些原因没有被利用上。那么这种情况下通常可以尝试着多启动几个进程或者线程,让它们每个进程或者线程处理整个作业的一部分,最后结束的时候做一个“合并”操作,提高并行化,提高资源利用率。
再比如,为了缓存一些数据做迭代运算,磁盘发生非常频繁的读写,每次几个GB(量比较小,至少内存能够承载),但是一次处理可能要读写数百次,这样会大量占用磁盘IO。这种情况下,不妨尝试把内存中虚拟或者划分出一个独立的空间,以供做IO使用。这样把CPU和磁盘之间的IO转化成为CPU和内存之间的IO,这种效率的提升可能是数千倍的。
还有就是,磁盘IO的过程中,是不是扫描了一些本可以不扫描的磁盘块。对付这种问题其实成熟的办法有很多,比如数据库里的索引就是。还有,在数据仓库里使用列式存储,从本质来讲也是用这种方法来规避没必要的数据块被扫描。
资源分配不合理的情况比较好解决,就是找出在系统里CPU、内存、磁盘、网络,哪些资源被大量闲置,如果利用起来能否提高并行性,基本就是这样一个思路。
资源不足的情况通常比较麻烦,因为如果你观察到服务器上的CPU、磁盘IO、网络IO都非常繁忙,就要想办法先排除一下是业务逻辑上设计的疏漏导致的不合理或者意外的资源请求太多,还是“真的”资源不够。如果是由于一些疏漏导致的资源请求过于集中,那么通过DEBUG或者优化业务逻辑,还是能够获解的。但是如果这些问题都不是,那就是资源确实比客观需求少了。典型的例子就是,我在保存日志的情况下,业务要求无损永久存档,但是我即便在启用压缩且不留冗余的情况下,还是很快把磁盘填满,那这样就是典型的磁盘资源不足了。
总之,按照我的看法就还是要先用一些办法确定资源分配究竟是不足还是不合理,再用“低成本”的资源换取“高成本”的资源。