写代码如何合理使用和优化我们的机器资源(CPU、内存、网络、磁盘)

写代码脑子一定要绷紧一根弦,认知到我们所在的机器资源是有限的。机器资源有哪些?CPU、内存、网络、磁盘等,如果不做好保护控制工作,一旦某一资源满负荷,很容易导致出现线上问题。

1 CPU 资源怎么限制


计算算法优化。如果服务需要进行大量的计算,比如推荐排序服务,那么务必对你的计算算法进行优化,比如笔者曾经对地理空间距离计算这一重度使用的算法进行了优化,取得了较好的效果,详见《地理空间距离计算优化》一文。

锁。对于很多服务而言,没有那么多耗费计算资源的算法,但 CPU 使用率也很高,这个时候需要看看锁的使用情况,我的建议是如无必要,尽量不用显式使用锁。

习惯问题。比如写循环的时候,千万要检查看看是否能正确退出,有些时候一不小心,在某些条件下就成为死循环,很著名的案例就是《多线程下HashMap的死循环问题》。比如集合遍历时候使用性能较差的遍历方式、String + 检查,如果有超过多个 String 相加,是否使用 StringBuffer.append?

尽量使用线程池。通过线程池来限制线程的数目,避免线程过多造成的线程上下文切换的开销。

JVM 参数调优。JVM 参数也会影响 CPU 的使用,如《发布或重启线上服务时抖动问题解决方案》。

2 内存资源怎么限制


JVM 参数设置。通过 JVM 参数的设置来限制内存使用,JVM 参数调优比较靠经验,有一篇朋友写的好文可以参考《Linux 与 JVM 的内存关系分析》。

初始化 Java 集合类大小。使用 Java 集合类的时候尽量初始化大小,在长连接服务等耗费内存资源的服务中这种优化非常重要。

使用内存池/对象池

使用线程池的时候一定要设置队列的最大长度。之前看过好多起故障都是由于队列最大长度没有限制最后导致内存溢出。

如果数据较大避免使用本地缓存。如果数据量较大,可以考虑放置到分布式缓存如 Redis、Tair 等,不然 gc 都可能把自己服务卡死。

对缓存数据进行压缩。比如之前做推荐相关服务时,需要保存用户偏好数据,如果直接保存可能有 12G,后来采用短文本压缩算法直接压缩到 6G,不过这时一定要考虑好压缩解压缩算法的 cpu 使用率、效率与压缩率的平衡,一些压缩率很高但是性能很差的算法,也不适合线上实时调用。有些时候直接使用 probuf 来序列化之后保存,这样也能节省内存空间。

清楚第三方软件实现细节,精确调优。在使用第三方软件时,只有清楚细节后才知道怎么节约内存,这点我在实际工作中深有体会,比如之前在阅读过lucene的源码后发现我们的索引文件原来是可以压缩的,而这在说明文档中都找不到,具体参考《lucene索引文件大小优化小结》一文。

3 网络资源怎么限制


减少调用的次数。经常看到有同学在循环里用 redis/tair 的 get,如果意识到这里面的网络开销的话就应该使用批量处理;又如在推荐服务中经常遇到要去多个地方去取数据,一般采用多线程并行去取数据,这个时候不仅耗费cpu资源,也耗费网络资源,一种在实际中常常采用的方法就是先将很多数据离线存储到一块 ,这时候线上服务只要一个请求就能将所有数据获取。

减少传输的数据量。一种方法是压缩后传输,还有一种就是按需传输,比如经常遇到的 getData(int id),如果我们返回该 id 对应的 Data 所有信息,一来人家不需要,二来数据量传输太大,这个时候可以改为 getData(int id, Listfields),使用方传输相应的字段过来,服务端只返回使用方需要的字段即可。

4 磁盘资源怎么限制

打日志要控制量,并定期清理。1)只打印关键的异常日志;2)对日志大小进行监控报警。我有一次就遇到了第三方服务挂了,然后我这边就不断打印调用该第三方服务异常的日志,本来我的服务有降级方案,如果第三方服务挂了会自动使用其它服务,但是突然收到报警说我服务挂了,登上机器一看才知道是磁盘不够导致的崩溃;3)定期对日志进行清理,比如用 crontab,每隔几天对日志进行清理;4)打印日志到远端,对于一些比较重要的日志可以直接将日志打印到远端HDFS文件系统里;

备注

基础原则……控制资源的使用

原文地址:https://www.cnblogs.com/ysgcs/p/10005884.html

时间: 2024-10-11 21:07:08

写代码如何合理使用和优化我们的机器资源(CPU、内存、网络、磁盘)的相关文章

性能优化之基础资源cpu&内存(JVM)

本章主要介绍计算机的一些基础资源以及操作系统处理后的一些基础资源. 主要包括 cpu 内存 磁盘 网络 线程 本章会介绍这些资源的一些原理,介绍如何查看资源的数量,使用情况,对性能和整体计算机执行的一些影响.本章很多内容都基于linux,不是特殊说明,就是针对linux的情况.可能在其它操作系统不一定适用. 另外还会对jvm之上的一些内容做特殊说明,因为大家很大的一些积累都在jvm之上,内部的系统基本也建立在jvm上. jvm 指令 jvm 内存使用 cpu cpu是计算机里最重要的资源,没有之

通过限时写代码,优化代码的方式。

1.通过限时写代码,优化代码的方式. 1.containerView ->frame:self.window.bounds containerView.frame = self.window.bounds 初始化窗口跟window一样大 2.命名:View:containerView label:userNameLabel 3.内存管理:1.View ->alloc —>对应着有一个release 4.window的内存管理: 1.把strong改为retain 2.重写dealloc方

【转载】-如何写代码-编程智慧

原文地址:http://www.yinwang.org/blog-cn/2015/11/21/programming-philosophy 编程是一种创造性的工作,是一门艺术.精通任何一门艺术,都需要很多的练习和领悟,所以这里提出的"智慧",并不是号称一天瘦十斤的减肥药,它并不能代替你自己的勤奋.然而由于软件行业喜欢标新立异,喜欢把简单的事情搞复杂,我希望这些文字能给迷惑中的人们指出一些正确的方向,让他们少走一些弯路,基本做到一分耕耘一分收获. 反复推敲代码 既然"天才是百分

转载-如何写代码-编程智慧

http://www.yinwang.org/blog-cn/2015/11/21/programming-philosophy/编程的智慧 编程是一种创造性的工作,是一门艺术.精通任何一门艺术,都需要很多的练习和领悟,所以这里提出的“智慧”,并不是号称一天瘦十斤的减肥药,它并不能代替你自己的勤奋.然而由于软件行业喜欢标新立异,喜欢把简单的事情搞复杂,我希望这些文字能给迷惑中的人们指出一些正确的方向,让他们少走一些弯路,基本做到一分耕耘一分收获. 反复推敲代码 既然“天才是百分之一的灵感,百分之

开始写代码了:“Hello World”

1.先来了解一下写代码的流程1)创建xxx.py的文件 (注意文件不要以中文命名,否则导入的时候会出现不可预知的错误.)2)写代码 a.头部两行 :#!User/bin/env python                        # -*- coding:utf-8 -*- b.写功能代码3)执行代码 a.打开执行终端 (快捷键:功能键+R) b.python 代码文件路径 2.写第一个代码:hello world: >>>print("Hello World"

不仅仅是写代码,而是完成作品

近来有人问起,现在似乎真得变成了码农,日出而作,日落而息.整天不停的写代码,开发业务需求,周而复始,日子长了,感到厌倦.有时回想,应该在过去的某个时期我也曾陷入过这样的循环中,后来又是如何脱离的呢? 代码与缘由 这要回归到从写代码这件事上开始.写代码是因为有需求,需求来自业务的发展需要,需求经过产品经理再传递到程序员. 刚开始,作为一个新手程序员,不停的为各种需求写代码.开发完一个,接着又是下一个,生生不息,循环不止.一开始也许会感觉有些累,但并没有产生太多的厌倦.这是一个从不熟悉到熟悉再到熟练

3-3 多使用PHP自身能力=== 少写代码,多用php内置

优化点:少写代码,多用php自身能力 性能问题 代码冗长较多,可读性不佳,并且性能低 多使用内置常量 变量 函数

写日志函数和持续优化

首先看下面的函数 <span style="font-size:18px;">void writelog(char* file, char* msg) { FILE*fp=NULL; int nDataLen = strlen(msg); fp=fopen(file,"ab+");//只供读取 if(fp!=NULL) { fwrite(msg, nDataLen, 1, fp); } fclose(fp);//关闭文件 }</span> 这

写代码,更需要设计代码

迭代是代码最终能成功发布的关键.因为没有人第一次写程序就能搞定,任何人都不行.如果有人说他是例外,那么——我敢说他在撒谎.我们可以从错误中学习和进步.我从来不会在第一次尝试的时候就去优化代码.第一次尝试是迭代的原型,通过一次次迭代最终出来一个完美的产品. 三思而后行 如果有人使用的不是工程学术语来定义他们编写代码的过程,我的脑子里会自动脑补出一幅他们在拼命将一个球体塞入三角形的洞里的情景.编程对我而言是一种爱好.我沉迷于我的爱好,并且还能拿薪水,所以我一直以来都竭尽全力并且以此为荣.所以请原谅我