精华内容
下载资源
问答
  • 那么,怎么样才能找到是哪一个网站的? 1、在任务管理器中增加显示pid字段。就可以看到占用内存或者cpu最高的进程pid 2、在命令提示符下运行iisapp -a。注意,第一次运行,提示没有js支持,点击确定。然后再次...
  • w3wp.exe是在IIS(因特网信息服务器)与应用程序池相关联的一个进程,如果你有多个应用程序池,就有对应的多个w3wp.exe的进程实例运行。...那么,怎么样才能找到是哪一个网站的? 1、在任务管理器中增加显示pid字段。就
  • Android最佳性能实践(一)——合理管理内存

    万次阅读 多人点赞 2015-02-05 09:20:28
    有不少朋友都问过我,怎样才能写出高性能的应用程序,如何避免程序出现OOM,或者当程序内存占用过高的时候该怎么样去排查。确实,一个优秀的应用程序,不仅仅要功能完成得好,性能问题也应该处理得恰到好处。为此,...

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/42238627


    有不少朋友都问过我,怎样才能写出高性能的应用程序,如何避免程序出现OOM,或者当程序内存占用过高的时候该怎么样去排查。确实,一个优秀的应用程序,不仅仅要功能完成得好,性能问题也应该处理得恰到好处。为此,我也是阅读了不少Android官方给出的高性能编程建议,那么从本篇文章开始,我就准备开始写一个全新系列的博文,来把这些建议进行整理和分析,帮助大家能够写出更加出色的应用程序。


    注意本系列文章的内容基本源于Android Doc,如果想要阅读更加详细的关于性能方面的资料,可以直接去阅读Android官方文档。


    内存(RAM)对于任何一个软件开发环境都是种非常珍贵的资源,而对于移动操作系统来讲的话,则会显得更加珍贵,因为手机的硬件条件相对于PC毕竟是比较落后的。尽管Android系统的虚拟机拥有自动回收垃圾的机制,但这并不代表我们就可以忽视应该在什么时候分配和释放内存。


    为了使垃圾回收器可以正常释放程序所占用的内存,在编写代码的时候就一定要注意尽量避免出现内存泄漏的情况(通常都是由于全局成员变量持有对象引用所导致的),并且在适当的时候去释放对象引用。对于大多数的应用程序而言,后面其它的事情就可以都交给垃圾回收器去完成了,如果一个对象的引用不再被其它对象所持有,那么系统就会将这个对象所分配的内存进行回收。


    我们在开发软件的时候应当自始至终都把内存的问题充分考虑进去,这样的话才能开发出更加高性能的软件。而内存问题也并不是无规律可行的,Android系统给我们提出了很多内存优化的建议技巧,只要按照这些技巧来编写程序,就可以让我们的程序在内存性能发面表现得相当不错,下面我们就来一一学习一下这些技巧。


    节制地使用Service


    如果应用程序当中需要使用Service来执行后台任务的话,请一定要注意只有当任务正在执行的时候才应该让Service运行起来。另外,当任务执行完之后去停止Service的时候,要小心Service停止失败导致内存泄漏的情况。


    当我们启动一个Service时,系统会倾向于将这个Service所依赖的进程进行保留,这样就会导致这个进程变得非常消耗内存。并且,系统可以在LRU cache当中缓存的进程数量也会减少,导致切换应用程序的时候耗费更多性能。严重的话,甚至有可能会导致崩溃,因为系统在内存非常吃紧的时候可能已无法维护所有正在运行的Service所依赖的进程了。


    为了能够控制Service的生命周期,Android官方推荐的最佳解决方案就是使用IntentService,这种Service的最大特点就是当后台任务执行结束后会自动停止,从而极大程度上避免了Service内存泄漏的可能性。关于IntentService更加详细的用法讲解,可以参考《第一行代码——Android》的9.5.2节。


    让一个Service在后台一直保持运行,即使它并不执行任何工作,这是编写Android程序时最糟糕的做法之一。所以Android官方极度建议开发人员们不要过于贪婪,让Service在后台一直运行,这不仅可能会导致手机和程序的性能非常低下,而且被用户发现了之后也有可能直接导致我们的软件被卸载(我个人就会这么做)。


    当界面不可见时释放内存


    当用户打开了另外一个程序,我们的程序界面已经不再可见的时候,我们应当将所有和界面相关的资源进行释放。在这种场景下释放资源可以让系统缓存后台进程的能力显著增加,因此也会让用户体验变得更好。


    那么我们如何才能知道程序界面是不是已经不可见了呢?其实很简单,只需要在Activity中重写onTrimMemory()方法,然后在这个方法中监听TRIM_MEMORY_UI_HIDDEN这个级别,一旦触发了之后就说明用户已经离开了我们的程序,那么此时就可以进行资源释放操作了,如下所示:

    @Override
    public void onTrimMemory(int level) {
    	super.onTrimMemory(level);
    	switch (level) {
    	case TRIM_MEMORY_UI_HIDDEN:
    		// 进行资源释放操作
    		break;
    	}
    }

    注意onTrimMemory()方法中的TRIM_MEMORY_UI_HIDDEN回调只有当我们程序中的所有UI组件全部不可见的时候才会触发,这和onStop()方法还是有很大区别的,因为onStop()方法只是当一个Activity完全不可见的时候就会调用,比如说用户打开了我们程序中的另一个Activity。因此,我们可以在onStop()方法中去释放一些Activity相关的资源,比如说取消网络连接或者注销广播接收器等,但是像UI相关的资源应该一直要等到onTrimMemory(TRIM_MEMORY_UI_HIDDEN)这个回调之后才去释放,这样可以保证如果用户只是从我们程序的一个Activity回到了另外一个Activity,界面相关的资源都不需要重新加载,从而提升响应速度。


    当内存紧张时释放内存


    除了刚才讲的TRIM_MEMORY_UI_HIDDEN这个回调,onTrimMemory()方法还有很多种其它类型的回调,可以在手机内存降低的时候及时通知我们。我们应该根据回调中传入的级别来去决定如何释放应用程序的资源:

    • TRIM_MEMORY_RUNNING_MODERATE    表示应用程序正常运行,并且不会被杀掉。但是目前手机的内存已经有点低了,系统可能会开始根据LRU缓存规则来去杀死进程了。
    • TRIM_MEMORY_RUNNING_LOW    表示应用程序正常运行,并且不会被杀掉。但是目前手机的内存已经非常低了,我们应该去释放掉一些不必要的资源以提升系统的性能,同时这也会直接影响到我们应用程序的性能。
    • TRIM_MEMORY_RUNNING_CRITICAL    表示应用程序仍然正常运行,但是系统已经根据LRU缓存规则杀掉了大部分缓存的进程了。这个时候我们应当尽可能地去释放任何不必要的资源,不然的话系统可能会继续杀掉所有缓存中的进程,并且开始杀掉一些本来应当保持运行的进程,比如说后台运行的服务。

    以上是当我们的应用程序正在运行时的回调,那么如果我们的程序目前是被缓存的,则会收到以下几种类型的回调:

    • TRIM_MEMORY_BACKGROUND    表示手机目前内存已经很低了,系统准备开始根据LRU缓存来清理进程。这个时候我们的程序在LRU缓存列表的最近位置,是不太可能被清理掉的,但这时去释放掉一些比较容易恢复的资源能够让手机的内存变得比较充足,从而让我们的程序更长时间地保留在缓存当中,这样当用户返回我们的程序时会感觉非常顺畅,而不是经历了一次重新启动的过程。
    • TRIM_MEMORY_MODERATE    表示手机目前内存已经很低了,并且我们的程序处于LRU缓存列表的中间位置,如果手机内存还得不到进一步释放的话,那么我们的程序就有被系统杀掉的风险了。
    • TRIM_MEMORY_COMPLETE    表示手机目前内存已经很低了,并且我们的程序处于LRU缓存列表的最边缘位置,系统会最优先考虑杀掉我们的应用程序,在这个时候应当尽可能地把一切可以释放的东西都进行释放。


    避免在Bitmap上浪费内存


    当我们读取一个Bitmap图片的时候,有一点一定要注意,就是千万不要去加载不需要的分辨率。在一个很小的ImageView上显示一张高分辨率的图片不会带来任何视觉上的好处,但却会占用我们相当多宝贵的内存。需要仅记的一点是,将一张图片解析成一个Bitmap对象时所占用的内存并不是这个图片在硬盘中的大小,可能一张图片只有100k你觉得它并不大,但是读取到内存当中是按照像素点来算的,比如这张图片是1500*1000像素,使用的ARGB_8888颜色类型,那么每个像素点就会占用4个字节,总内存就是1500*1000*4字节,也就是5.7M,这个数据看起来就比较恐怖了。


    至于如何去压缩图片,以及更多在图片方面节省内存的技术,大家可以去参考我之前写的一篇博客 Android高效加载大图、多图解决方案,有效避免程序OOM 。


    使用优化过的数据集合


    Android API当中提供了一些优化过后的数据集合工具类,如SparseArray,SparseBooleanArray,以及LongSparseArray等,使用这些API可以让我们的程序更加高效。传统Java API中提供的HashMap工具类会相对比较低效,因为它需要为每一个键值对都提供一个对象入口,而SparseArray就避免掉了基本数据类型转换成对象数据类型的时间。


    知晓内存的开支情况


    我们还应当清楚我们所使用语言的内存开支和消耗情况,并且在整个软件的设计和开发当中都应该将这些信息考虑在内。可能有一些看起来无关痛痒的写法,结果却会导致很大一部分的内存开支,例如:

    • 使用枚举通常会比使用静态常量要消耗两倍以上的内存,在Android开发当中我们应当尽可能地不使用枚举。
    • 任何一个Java类,包括内部类、匿名类,都要占用大概500字节的内存空间。
    • 任何一个类的实例要消耗12-16字节的内存开支,因此频繁创建实例也是会一定程序上影响内存的。
    • 在使用HashMap时,即使你只设置了一个基本数据类型的键,比如说int,但是也会按照对象的大小来分配内存,大概是32字节,而不是4字节。因此最好的办法就是像上面所说的一样,使用优化过的数据集合。


    谨慎使用抽象编程


    许多程序员都喜欢各种使用抽象来编程,认为这是一种很好的编程习惯。当然,这一点不可否认,因为的抽象的编程方法更加面向对象,而且在代码的维护和可扩展性方面都会有所提高。但是,在Android上使用抽象会带来额外的内存开支,因为抽象的编程方法需要编写额外的代码,虽然这些代码根本执行不到,但是却也要映射到内存当中,不仅占用了更多的内存,在执行效率方面也会有所降低。当然这里我并不是提倡大家完全不使用抽象编程,而是谨慎使用抽象编程,不要认为这是一种很酷的编程方式而去肆意使用它,只在你认为有必要的情况下才去使用。


    尽量避免使用依赖注入框架


    现在有很多人都喜欢在Android工程当中使用依赖注入框架,比如说像Guice或者RoboGuice等,因为它们可以简化一些复杂的编码操作,比如可以将下面的一段代码:

    class AndroidWay extends Activity { 
    	TextView name; 
    	ImageView thumbnail; 
    	LocationManager loc; 
    	Drawable icon; 
    	String myName; 
    
    	public void onCreate(Bundle savedInstanceState) { 
    		super.onCreate(savedInstanceState); 
    		setContentView(R.layout.main);
    		name      = (TextView) findViewById(R.id.name); 
    		thumbnail = (ImageView) findViewById(R.id.thumbnail); 
    		loc       = (LocationManager) getSystemService(Activity.LOCATION_SERVICE); 
    		icon      = getResources().getDrawable(R.drawable.icon); 
    		myName    = getString(R.string.app_name); 
    		name.setText( "Hello, " + myName ); 
    	} 
    } 
    简化成这样的一种写法:
    @ContentView(R.layout.main)
    class RoboWay extends RoboActivity { 
    	@InjectView(R.id.name)             TextView name; 
    	@InjectView(R.id.thumbnail)        ImageView thumbnail; 
    	@InjectResource(R.drawable.icon)   Drawable icon; 
    	@InjectResource(R.string.app_name) String myName; 
    	@Inject                            LocationManager loc; 
    
    	public void onCreate(Bundle savedInstanceState) { 
    		super.onCreate(savedInstanceState); 
    		name.setText( "Hello, " + myName ); 
    	} 
    }

    看上去确实十分诱人,我们甚至可以将findViewById()这一类的繁琐操作全部省去了。但是这些框架为了要搜寻代码中的注解,通常都需要经历较长的初始化过程,并且还可能将一些你用不到的对象也一并加载到内存当中。这些用不到的对象会一直占用着内存空间,可能要过很久之后才会得到释放,相较之下,也许多敲几行看似繁琐的代码才是更好的选择。


    使用ProGuard简化代码


    ProGuard相信大家都不会陌生,很多人都会使用这个工具来混淆代码,但是除了混淆之外,它还具有压缩和优化代码的功能。ProGuard会对我们的代码进行检索,删除一些无用的代码,并且会对类、字段、方法等进行重命名,重命名之后的类、字段和方法名都会比原来简短很多,这样的话也就对内存的占用变得更少了。


    使用多个进程


    这个技巧其实并不是非常建议使用,但它确实是一种可以帮助我们节省和管理内存的高级技巧。如果你要使用它的话一定要谨慎使用,因为绝大多数的应用程序都不应该在多个进程当中运行的,一旦使用不当,它甚至会增加额外的内存而不是帮我们节省内存。这个技巧比较适用于那些需要在后台去完成一项独立的任务,和前台的功能是可以完全区分开的场景。


    这里举一个比较适合去使用多进程技巧的场景,比如说我们正在做一个音乐播放器软件,其中播放音乐的功能应该是一个独立的功能,它不需要和UI方面有任何关系,即使软件已经关闭了也应该可以正常播放音乐。如果此时我们只使用一个进程,那么即使用户关闭了软件,已经完全由Service来控制音乐播放了,系统仍然会将许多UI方面的内存进行保留。在这种场景下就非常适合使用两个进程,一个用于UI展示,另一个则用于在后台持续地播放音乐。


    想要实现多进程的功能也非常简单,只需要在AndroidManifest文件的应用程序组件中声明一个android:process属性就可以了,比如说我们希望播放音乐的Service可以运行在一个单独的进程当中,就可以这样写:

    <service android:name=".PlaybackService"
             android:process=":background" />

    这里指定的进程名是background,你也可以将它改成任意你喜欢的名字。需要注意的是,进程名的前面都应该加上一个冒号,表示该进程是一个当前应用程序的私有进程。


    遵循以上的所有编程建议,我们就可以让应用程序内存的使用变得更加合理化。但这只是第一步而已,为了要让程序拥有最佳性能,我们要学习的东西还有很多,下篇文章当中将会介绍如何分析内存的使用情况,感兴趣的朋友请继续阅读 Android最佳性能实践(二)——分析内存的使用情况 。


    关注我的技术公众号,每天都有优质技术文章推送。关注我的娱乐公众号,工作、学习累了的时候放松一下自己。

    微信扫一扫下方二维码即可关注:

            

    展开全文
  • ... 运维工程师工作中一定遇到这样的问题:新业务上线了,导致 CPU 使用过高内存占用过大,怎么办?服务器上几百上千,甚至数万台,手动运维痛苦不堪?使用现有的开源软件软件,...
        

    640?


    运维工程师工作中一定会遇到这样的问题:新业务上线了,导致 CPU 使用过高,内存占用过大,怎么办?


    640?wx_fmt=gif


    服务器上几百上千,甚至数万台,手动运维痛苦不堪?


    640?wx_fmt=gif


    使用现有的开源软件软件,跨平台的维护,天天加班,你还能忍吗?


    如果你不会开发,你只能查到进程级别,然后交给开发人员处理了。这样如何体现你运维的价值?


    升职加薪基本与你无缘!!!!!


    没有价值的职场人,要升职加薪谈何容易。然而每年照旧有大把的运维人潇洒跳槽,涨薪过半。


    工作一年以上的业务运维都见过这样的同事:工作从不加班,却总是成果斐然。你上周吃住在机房总算维护了100台服务器,他只是敲一下键盘维护数量轻松上千。这种人要么早早加薪升职,要么就被重金挖走。


    为什么?简单,因为他是运维开发。他精通运维,也熟悉开发,他一个人能干10个人的活,却只领两个人的钱。他的魔法就在于他掌握了一门开发语言。


    现阶段,掌握一门开发语言已经成为高级运维工程师的必备技能。运维学开发,Python势必是你不二之选。PYTHON被称为胶水语言, 能满足绝大部分自动化运维的需求,又能做后端 C/S 架构,又能用 WEB 框架快速开发出高大上的 WEB 界面,还能做机器学习。


    当你还在观望的时候,有人已经把Python应用到了Linux运维中的常用的一些应用:


    静态文件服务器


    640

    静态文件服务器

    ■ 使用redux管理状态

    ■ 前端api与后端交互、数据封装、状态变化等


    Python开发的jumpserver跳板机


    640


    jumpserver跳板机

    ■ jumpserver跳板机是一款由Python编写开源的跳板机(堡垒机)系统,实现了跳板机应有的功能。基于ssh协议来管理,客户端无需安装agent

    ■ 企业主要用于解决:可视化安全管理、

    ■ 特点:完全开源,GPL授权

    ■ 实现了跳板机基本功能:认证、授权、审计。集成了Ansible、批量命令等

    ■ 录像回放、命令搜索、实时监控、批量上传下载

    Python开发的Magedu分布式监控系统


    640


    分布式监控系统

    ■ 以自动化运维视角为出发点,自动化功能、监控告警、性能调优,结合saltstack实现自动化配置管理

    ■ 企业主要用于解决:自动化监控常用系统服务、应用、网络设备等

    ■ 分布式可监控更多服务器,分区域监控再汇总


    Python开发的Magedu的CMDB


    640


    CMDB

    ■ cmdb的开发需要包含三部分功能:采集硬件数据、API、页面管理

    ■ 企业主要用于解决:项目功能,采集硬件数据、Api、页面管理。统计资产,例如服务器存放位置,服务器上的账号等等

    Python开发的任务调度系统


    640


    任务调度系统

    ■ Python任务调度系统的multiprocessing模块不但支持多进程,其中managers子模块还支持把多进程分布到多台机器

    ■企业主要用于解决:批量管理crontab定时任务。

    Python运维流程系统


    640


    运维流程系统

    ■ 内部用来创建、监控和调整数据管道。任何工作流都可以在这个使用Python来编写的平台上运行

    ■ 企业主要用于规范运维的操作,加入审批,一步一步操作的概念

    ■ 允许工作流开发人员轻松创建、维护和周期性地调度运行工作流(即有向无环图或成为DAGs)的工具

    ■ 拥有和 Hive、Presto、MySQL、HDFS、Postgres和S3交互的能力,并且提供了钩子使得系统拥有很好地扩展性


    来个小总结:

    几个实战项目之间的结合,可以理解成,运维流程系统,就是规范运维的每一步操作,审批通过后,通过调用任务调度系统来定制批量操作。任务调度系统操作的过程中,可以通过CMDB资产管理系统来获取服务器的详细信息,ip地址,用户名,密码等。


    如果是需要运维人员直接登陆到服务器上操作,需要通过跳板机来登陆服务器,记录谁登陆了哪台服务器,具体做了什么操作等。


    有了这套系统,老板肯定会觉得高大上有没有?你也会说这很简单,但是结果是你根本做不出来,作为运维,你还觉得不学习Python也无所谓吗?如果你还觉得无所谓,那么同样是做运维,半年后,掌握Python的运维比你下班早,涨薪30%,而你只有眼巴巴看。


    所有的改变有两种选择

    要么是明天

    要么是现在。


    云计算10月免费课程火热抢先中,5天运维课程免费听,点击文末“阅读原文”即可免费听课当然也有其他IT课程免费听(Java、前端、大数据、Python、设计、C++、嵌入式、网络营销),后台回复“姓名+联系方式+所在+课程名称”也可申请其他免费课程,火速抢先~~~~

    PS:记得查收小编送你的免费大礼包呦~

    福利 | 一万多套PPT模板等你免费来拿!无条件领取!

    免费送 | 1000多套简历模板免费拿,附赠简历制作教程!

    免费领 | 《Shell脚本 100例》电子书免费拿,运维必备干货~

    640?640?wx_fmt=jpeg

    ▼▼点击【阅读原文】,免费听5天Linux运维干货分享课,火热开讲中,速来抢!

    展开全文
  • 在我们的认知中,运维工程师就是一个背锅侠,那么咱们怎么样来避免做背锅侠那?可能有人告诉你,你需要去懂一门开发语言,其实...一个业务上线了,导致CPU使用过高内存占用过大,如果你不会开发,你可能只能查到...

    在我们的认知中,运维工程师就是一个背锅侠,那么咱们怎么样来避免做背锅侠那?

    可能有人会告诉你,你需要去懂一门开发语言,其实在现价段,掌握一门开发语言已经成为高级运维工程师的必备计能。不会开发,你就不能充分理解你们系统的业务流程,开发人员是很少关注性能的问题,他们只会把功能开发完成就可以了,那么性能问题就需要运维人员来做。一个业务上线了,导致CPU使用过高,内存占用过大,如果你不会开发,你可能只能查到进程级别,也就是哪个进程占用这么多,然后呢?然后就交给开发人员处理了,这样咋体现你的价值?如果是这样的话,那么你活该做背锅侠。

    回到咱们的问题:

    运维工程师是要学python还是学go那?

    答案是显而易见的:必须是python,那么为什么是python那?为什么不用PHP,JAVA, C++,RUBY,这里我只能说,仁者见仁智者见智, 如果你碰巧已经掌握了除Python之外的其它语言,那你爱用啥用啥,如果你是一个连SHELL都还没写明白的新手,想学个语言的话,请用Python,为什么呢?

    首先,PHP是跟Python比的最多的,其实他俩根本就不用比,为什么呢?两个语言适用性不同,PHP主要适用于Web开发,可以迅速的做出中小型,轻量级的WEB网站,但后端嘛,基本还是要借助其它语言,借助什么语言呢?Shell?Python?呵呵。而Python呢,是个综合语言,前后端都可以,单拿出来比Web,也一点不比PHP差,但为什么Web方向上PHP比Python要火?

    先入为主嘛,PHP 90年代诞生就是做Web的,Python2000年后才出现Web框架,但论优秀程度上,Python的Web框架基本上出其无左,至少是跟PHP比。

    那JAVA呢?好吧,一个臃肿、中庸、豪无新意的语言,还是老老实实用它来做ERP吧,搞个运维小平台,用JAVA真心没啥必要,在我看来,JAVA就是稳定的中年男人,稳定、成熟、秃顶,而Python代表的就是青春,简洁、快、干净、帅!

    C++/C,这个嘛,我只能说,如果你会了Python,又会C的话,那你会更吃香,但是不会C的话,其实也无大碍,基本上做运维的人,搞搞C就是为了来装B的,因为多数情况下你都到不了看系统底层源码的程度, 不过如果你学好了Python之后,还是建议你学习下C++,毕竟相比Python这个动态语言来讲,C++的效率还是高很多的,但对新手来讲,不建议做为第一门语言开始学习,为什么呢?打击自信心…呵呵,你懂的

    Ruby,小日本开发的,还不错,风格跟Python有点像,因为Ruby onrails出了名,国外用的比较多,国内,放心吧,没戏,Python已经把它的想象空间都占死了。

    当然还有新的语言GO,有些搞运维的看见做开发的人员搞GO,也想凑热闹,觉得是未来,我想说,别瞎没事跟风,GO再成功,也不会变成运维开发语言。

    有些人觉得Python效率低,说他不能支持多线程,OH,好吧,这个还有点说对了

    但是你知道PYTHON为什么不支持多线程吗?其实Python支持多线程,只是不支持多CPU多线程,也就是一个程序spawn出来的多线程只能占用一个CPU,但是为什么呢?噢,因为GIL,GIL是什么东东,请自行补脑。。。但是你非得用多线程吗?你可以用多进程呀,再牛B你还可以用协程呀,这些Python支持的都很好呀,如果你的程序逻辑不好,搞个多线程也快不起来。

    那如果说python效率低,那么为什么这么多的软件都在用python开发那?运维同学们所熟知的软件,如ansible、saltstack、openstack哪一个不是python开发的?你能说这些软件效率都很差吗?

    这个时候可能就会有人说了:GO的效率高,这点我不得不承认,GO的效率高。那么我想问问GO有这么多成熟的第三方的库让你来调用吗?你当然可以使用GO来操作zabbix,那不好意思,你可能需要自己去写request请求了,而python有很多的第三方的库已经帮你实现了这个功能,你只需要拿过来直接使用就可以了

    展开全文
  • 在我们的认知中,运维工程师就是一个背锅侠,那么咱们怎么样来避免做背锅侠那?可能有人告诉你,你需要去懂一门开发语言,其实...一个业务上线了,导致CPU使用过高内存占用过大,如果你不会开发,你可能只能查到...

    在我们的认知中,运维工程师就是一个背锅侠,那么咱们怎么样来避免做背锅侠那?

    可能有人会告诉你,你需要去懂一门开发语言,其实在现价段,掌握一门开发语言已经成为高级运维工程师的必备计能。不会开发,你就不能充分理解你们系统的业务流程,开发人员是很少关注性能的问题,他们只会把功能开发完成就可以了,那么性能问题就需要运维人员来做。一个业务上线了,导致CPU使用过高,内存占用过大,如果你不会开发,你可能只能查到进程级别,也就是哪个进程占用这么多,然后呢?然后就交给开发人员处理了,这样咋体现你的价值?如果是这样的话,那么你活该做背锅侠。

    回到咱们的问题:

    运维工程师是要学python还是学go那?

    答案是显而易见的:必须是python,那么为什么是python那?为什么不用PHP,JAVA, C++,RUBY,这里我只能说,仁者见仁智者见智, 如果你碰巧已经掌握了除Python之外的其它语言,那你爱用啥用啥,如果你是一个连SHELL都还没写明白的新手,想学个语言的话,请用Python,为什么呢?

    首先,PHP是跟Python比的最多的,其实他俩根本就不用比,为什么呢?两个语言适用性不同,PHP主要适用于Web开发,可以迅速的做出中小型,轻量级的WEB网站,但后端嘛,基本还是要借助其它语言,借助什么语言呢?Shell?Python?呵呵。而Python呢,是个综合语言,前后端都可以,单拿出来比Web,也一点不比PHP差,但为什么Web方向上PHP比Python要火?

    先入为主嘛,PHP 90年代诞生就是做Web的,Python2000年后才出现Web框架,但论优秀程度上,Python的Web框架基本上出其无左,至少是跟PHP比。

    那JAVA呢?好吧,一个臃肿、中庸、豪无新意的语言,还是老老实实用它来做ERP吧,搞个运维小平台,用JAVA真心没啥必要,在我看来,JAVA就是稳定的中年男人,稳定、成熟、秃顶,而Python代表的就是青春,简洁、快、干净、帅!

    C++/C,这个嘛,我只能说,如果你会了Python,又会C的话,那你会更吃香,但是不会C的话,其实也无大碍,基本上做运维的人,搞搞C就是为了来装B的,因为多数情况下你都到不了看系统底层源码的程度, 不过如果你学好了Python之后,还是建议你学习下C++,毕竟相比Python这个动态语言来讲,C++的效率还是高很多的,但对新手来讲,不建议做为第一门语言开始学习,为什么呢?打击自信心…呵呵,你懂的

    Ruby,小日本开发的,还不错,风格跟Python有点像,因为Ruby onrails出了名,国外用的比较多,国内,放心吧,没戏,Python已经把它的想象空间都占死了。

    当然还有新的语言GO,有些搞运维的看见做开发的人员搞GO,也想凑热闹,觉得是未来,我想说,别瞎没事跟风,GO再成功,也不会变成运维开发语言。

    有些人觉得Python效率低,说他不能支持多线程,OH,好吧,这个还有点说对了

    但是你知道PYTHON为什么不支持多线程吗?其实Python支持多线程,只是不支持多CPU多线程,也就是一个程序spawn出来的多线程只能占用一个CPU,但是为什么呢?噢,因为GIL,GIL是什么东东,请自行补脑。。。但是你非得用多线程吗?你可以用多进程呀,再牛B你还可以用协程呀,这些Python支持的都很好呀,如果你的程序逻辑不好,搞个多线程也快不起来。

    那如果说python效率低,那么为什么这么多的软件都在用python开发那?运维同学们所熟知的软件,如ansible、saltstack、openstack哪一个不是python开发的?你能说这些软件效率都很差吗?

    这个时候可能就会有人说了:GO的效率高,这点我不得不承认,GO的效率高。那么我想问问GO有这么多成熟的第三方的库让你来调用吗?你当然可以使用GO来操作zabbix,那不好意思,你可能需要自己去写request请求了,而python有很多的第三方的库已经帮你实现了这个功能,你只需要拿过来直接使用就可以了

    展开全文
  • 随笔-第八周

    2017-02-27 11:02:00
     要怎么样安排自己的工作:将小的程序在白天工作,大的程序放在晚上执行。可以设置job来解决,但之前有尝试,却无法停止job 二 表分区  优势:提高查询效率。若只是能提高查询效率,不会占用其他的资源,...
  • 随笔-2-21

    2017-02-21 18:46:00
     要怎么样安排自己的工作:将小的程序在白天工作,大的程序放在晚上执行。可以设置job来解决,但之前有尝试,却无法停止job 二 表分区  优势:提高查询效率。若只是能提高查询效率,不会占用其他的资源,...
  • 1.2.8 对大数据平台中的元数据管理是怎么理解的,元数据收集管理体系是怎么样的,对大数据应用有什么样的影响 1.2.9 你理解常见如阿里,和友商大数据平台的技术体系差异以及发展趋势和技术瓶颈,在存储和计算两...
  • 电脑蓝屏对照码

    2019-05-05 14:16:40
    WIN XP蓝屏代码大全 一、... 另外, 有些主板(比如:nForce2主板)在进行超频后, 南桥芯片热也导致蓝屏, 此时为该芯片单独增加散热片往往可以有效解决问题. 22、0x00000080:NMI_HARDWARE_FAILURE ◆错误分析:通常是有...
  • WIN XP蓝屏代码大全

    2013-08-08 12:29:21
    另外, 有些主板(比如:nForce2主板)在进行超频后, 南桥芯片热也导致蓝屏, 此时为该芯片单独增加散热片往往可以有效解决问题. 22、0x00000080:NMI_HARDWARE_FAILURE ◆错误分析:通常是有硬件引起的....
  • 1.4 新的64位机上的64位类型是什么的? 32 指针声明 32 1.5 这样的声明有什么问题?char *p1, p2; 我在使用p2的时候报错了。 32 1.6 我想声明一个指针,并为它分配一些空间,但却不行。这样的代码有什么问题?...
  • 1.4 新的64位机上的64位类型是什么的? 32 指针声明 32 1.5 这样的声明有什么问题?char *p1, p2; 我在使用p2的时候报错了。 32 1.6 我想声明一个指针,并为它分配一些空间,但却不行。这样的代码有什么问题?...
  • c++ 面试题 总结

    2009-09-16 08:44:40
    这样造成很大的浪费,平均浪费了50%的内存空间,但时易于管理。 页式管理:把主存分为一页一页的,每一页的空间要比一块一块的空间小很多,显然这种方法的空间利用率要比块式管理很多。 段式管理:把主存分为...
  • 1.4 新的64位机上的64位类型是什么的? 3 指针声明 3 1.5 这样的声明有什么问题?char *p1, p2; 我在使用p2的时候报错了。 3 1.6 我想声明一个指针,并为它分配一些空间,但却不行。这样的代码有什么问题?...
  • 《你必须知道的495个C语言问题》

    热门讨论 2010-03-20 16:41:18
    1.4 新的64位机上的64位类型是什么的? 3 指针声明 3 1.5 这样的声明有什么问题?char *p1, p2; 我在使用p2的时候报错了。 3 1.6 我想声明一个指针,并为它分配一些空间,但却不行。这样的代码有什么问题?...
  • 你必须知道的495个C语言问题

    千次下载 热门讨论 2015-05-08 11:09:25
    1.4 新的64位机上的64位类型是什么的? 指针声明 1.5 这样的声明有什么问题?char*p1,p2;我在使用p2的时候报错了。 1.6 我想声明一个指针,并为它分配一些空间,但却不行。这样的代码有什么问题?char*p;*p=...
  • 1.4 新的64位机上的64位类型是什么的? 指针声明 1.5 这样的声明有什么问题?char*p1,p2;我在使用p2的时候报错了。 1.6 我想声明一个指针,并为它分配一些空间,但却不行。这样的代码有什么问题?char*p;*p=...
  • 如果空指针的内部表达不是 0 会怎么样? o 6.4 NULL 是什么, 它是怎么定义的? o 6.5 在使用非全零作为空指针内部表达的机器上, NULL 是如何定义的? o 6.6 如果 NULL 定义成 #define NULL ((char *)0) 难道不就...
  • 1.4 新的64位机上的64位类型是什么的? 指针声明 1.5 这样的声明有什么问题?char*p1,p2;我在使用p2的时候报错了。 1.6 我想声明一个指针,并为它分配一些空间,但却不行。这样的代码有什么问题?char*p;*p=...
  • Oracle Database 11g数据库管理艺术(涵盖DBA必知必的所有数据库管理知识) 基本信息 原书名: Expert Oracle Database 11g Administration 原出版社: Apress 作者: (美)Sam R.Alapati 译者: 钟鸣 杨桦 杨卫军 ...
  • 你必须知道的495个C语言问题(PDF)

    热门讨论 2009-09-15 10:25:47
    部表达不是0 会怎么样? . . . . . . . . . . . . . . . . . . . . . . . 22 5.4 NULL 是什么, 它是怎么定义的? . . . . . . . . . . . . . . . . . . 23 5.5 在使用非全零作为空指针内部表达的机器上, NULL 是如何...
  • sql总结.doc

    2019-08-27 22:08:51
    1、索引 ·什么是索引 ·索引的基本原理 ·索引的基本写法 ·索引的分类 ... 比如你判断一个班上的同学数学成绩怎么样,你就可能用游标,先把全部的成绩查询到游标中,之后再循环一条条进行判断处理。
  • OICQ 从无到有,现在可以说中国的每一个网吧都装有 OICQ,每一个上网的人都用 OICQ,那么 OICQ 的加密功能倒底怎么样呢, OICQ 版本从低到,其加密功能也越来越强,现在破解 OICQ 密码的方法大致有:穷举法、...

空空如也

空空如也

1 2
收藏数 33
精华内容 13
关键字:

内存占用过高会怎么样