Linux服务器性能检测命令集锦

uptime

1
2
$ uptime
23:51:26 up 21:31, 1 user, load average: 30.02, 26.43, 19.02

这个命令可以快速查看机器的负载情况。在Linux系统中,这些数据表示等待CPU资源的进程和阻塞在不可中断IO进程(进程状态为D)的数量。这些数据可以让我们对系统资源使用有一个宏观的了解。

命令的输出分别表示1分钟、5分钟、15分钟的平均负载情况。通过这三个数据,可以了解服务器负载是在趋于紧张还是区域缓解。如果1分钟平均负载很高,而15分钟平均负载很低,说明服务器正在命令高负载情况,需要进一步排查CPU资源都消耗在了哪里。反之,如果15分钟平均负载很高,1分钟平均负载较低,则有可能是CPU资源紧张时刻已经过去。

上面例子中的输出,可以看见最近1分钟的平均负载非常高,且远高于最近15分钟负载,因此我们需要继续排查当前系统中有什么进程消耗了大量的资源。可以通过下文将会介绍的vmstat、mpstat等命令进一步排查。


dmesg | tail

1
2
3
4
5
6
7
8
$ dmesg | tail
[1880957.563150] perl invoked oom-killer: gfp_mask=0x280da, order=0, oom_score_adj=0
[...]
[18694] 48 31550 101579 3871 0 0 0 服务名称
[...]
[1880957.563400] Out of memory: Kill process 18694 (perl) score 246 or sacrifice child
[1880957.563408] Killed process 18694 (perl) total-vm:1972392kB, anon-rss:1953348kB, file-rss:0kB
[2320864.954447] TCP: Possible SYN flooding on port 7001. Dropping request. Check SNMP counters.

该命令会输出系统日志的最后10行。通过【dmesg | tail -100f】还可以调整看到的日志总行数。
示例中的输出,可以看见一次内核的oom kill和一次TCP丢包。这些日志可以帮助排查性能问题。
比如线上某个服务突然异常,你怀疑是机器内存过高,系统自动杀死了这个服务的进程,那么可以通过系统日志排查。

查看更多

Lambda类库篇 —— Streams API, Collector和并行

本文是深入理解Java 8 Lambda系列的第二篇,主要介绍Java 8针对新增语言特性而新增的类库(例如Streams API、Collectors和并行)。

本文是对 Brian GoetzState of the Lambda: Libraries Edition 一文的翻译。


关于

Java SE 8增加了新的语言特性(例如lambda表达式和默认方法),为此Java SE 8的类库也进行了很多改进,本文简要介绍了这些改进。在阅读本文前,你应该先阅读深入浅出Java 8 Lambda(语言篇),以便对Java SE 8的新增特性有一个全面了解。


背景(Background)

自从lambda表达式成为Java语言的一部分之后,Java集合(Collections)API就面临着大幅变化。而JSR 355(规定了Java lambda表达式的标准)的正式启用更是使得Java集合API变的过时不堪。尽管我们可以从头实现一个新的集合框架(比如“Collection II”),但取代现有的集合框架是一项非常艰难的工作,因为集合接口渗透了Java生态系统的每个角落,将它们一一换成新类库需要相当长的时间。因此,我们决定采取演化的策略(而非推倒重来)以改进集合API:

  • 为现有的接口(例如Collection,List和Stream)增加扩展方法;
  • 在类库中增加新的流(stream,即java.util.stream.Stream)抽象以便进行聚集(aggregation)操作;
  • 改造现有的类型使之可以提供流视图(stream view);
  • 改造现有的类型使之可以容易的使用新的编程模式,这样用户就不必抛弃使用以久的类库,例如ArrayList和HashMap(当然这并不是说集合API会常驻永存,毕竟集合API在设计之初并没有考虑到lambda表达式。我们可能会在未来的JDK中添加一个更现代的集合类库)。

查看更多

Lambda语言篇 —— lambda, 方法引用, 目标类型和默认方法

本文介绍了Java SE 8中新引入的lambda语言特性以及这些特性背后的设计思想。这些特性包括:

  • lambda表达式(又被成为“闭包”或“匿名方法”)
  • 方法引用和构造方法引用
  • 扩展的目标类型和类型推导
  • 接口中的默认方法和静态方法

本文是对 Brian GoetzState of the Lambda 一文的翻译。


背景

Java是一门面向对象编程语言。面向对象编程语言和函数式编程语言中的基本元素(Basic Values)都可以动态封装程序行为:面向对象编程语言使用带有方法的对象封装行为,函数式编程语言使用函数封装行为。但这个相同点并不明显,因为Java的对象往往比较“重量级”:实例化一个类型往往会涉及不同的类,并需要初始化类里的字段和方法。

不过有些Java对象只是对单个函数的封装。例如下面这个典型用例:Java API中定义了一个接口(一般被称为回调接口),用户通过提供这个接口的实例来传入指定行为,例如:

1
2
3
public interface ActionListener {
void actionPerformed(ActionEvent e);
}

查看更多

Lambda应用场景和使用实例

Java 8已经推出一段时间了,Lambda是其中最火的主题,不仅仅是因为语法的改变,更重要的是带来了函数式编程的思想。这篇文章主要聊聊Lambda的应用场景及其相关使用示例。


Java为何需要Lambda

1996年1月,Java 1.0发布了,此后计算机编程领域发生了翻天覆地的变化。商业发展需要更复杂的应用,大多数程序都跑在更强大的装备多核CPU的机器上。带有高效运行期编译器的Java虚拟机(JVM)的出现,使得程序员将精力更多放在编写干净、易于维护的代码上,而不是思考如何将每一个CPU时钟、每一字节内存物尽其用。

多核CPU的出现成了“房间里的大象”,无法忽视却没人愿意正视。算法中引入锁不但容易出错,而且消耗时间。人们开发了java.util.concurrent包和很多第三方类库,试图将并发抽象化,用以帮助程序员写出在多核CPU上运行良好的程序。不幸的是,到目前为止,我们走得还不够远。

那些类库的开发者使用Java时,发现抽象的级别还不够。处理大数据就是个很好的例子,面对大数据,Java还欠缺高效的并行操作。Java 8允许开发者编写复杂的集合处理算法,只需要简单修改一个方法,就能让代码在多核CPU上高效运行。为了编写并行处理这些大数据的类库,需要在语言层面上修改现有的Java:增加lambda表达式。

当然,这样做是有代价的,程序员必须学习如何编写和阅读包含lambda表达式的代码,但是,这不是一桩赔本的买卖。与手写一大段复杂的、线程安全的代码相比,学习一点新语法和一些新习惯容易很多。开发企业级应用时,好的类库和框架极大地降低了开发时间和成本,也扫清了开发易用且高效的类库的障碍。

查看更多

Spark学习资料共享

链接相关

课件代码:http://pan.baidu.com/s/1nvbkRSt
教学视频:http://pan.baidu.com/s/1c12XsIG
这是最近买的付费教程,对资料感兴趣的可以在下方留下邮件地址,我会定期进行密码发送。


课程简介

以目前主流的,最新的spark稳定版2.1.x为基础,深入浅出地介绍Spark生态系统原理及应用,内容包括Spark各组件(Spark Core/SQL/Streaming/MLlib)基本原理,使用方法,实战经验以及在线演示。本课程精心设计了五个企业级应用案例,帮助大家在理解理论的基础上,亲手实践和应用spark。


课程优化

  1. 讲述最新、最稳定的Spark2.1.X版本
  2. 精心设计5个企业级应用案例,更好地实践、应用Spark

查看更多

Python 一切皆对象

Python从设计之初就是一门面向对象的语言,它有一个重要的概念,即一切皆对象。

Java虽然也是面向对象编程的语言,但是血统没有Python纯正。比如Java的八种基本数据类型之一int,在持久化的时候,就需要包装成Integer类对象。但是在python中,一切皆对象。数字、字符串、元组、列表、字典、函数、方法、类、模块等等都是对象,包括你的代码。


对象的概念

究竟何谓对象?不同的编程语言以不同的方式定义“对象”。某些语言中,它意味着所有对象必须有属性和方法;另一些语言中,它意味着所有的对象都可以子类化。

在Python中,定义是松散的,某些对象既没有属性也没有方法,而且不是所有的对象都可以子类化。但是Python的万物皆对象从感性上可以解释为:Python 中的一切都可以赋值给变量或者作为参数传递给函数。

Python 的所有对象都有三个特性:

  • 身份:每个对象都有一个唯一的身份标识自己,任何对象的身份都可以使用内建函数 id() 来得到,可以简单的认为这个值是该对象的内存地址。
    1
    2
    3
    >>> a = 1
    >>> id(a)
    >>> 26188904 # 身份由这样一串类似的数字表示

查看更多

Python 编码规范

Google官方英文版编码规范, 请移步 Google Style Guide
以下代码中 Yes 表示推荐,No 表示不推荐。


分号

不要在行尾加分号, 也不要用分号将两条命令放在同一行。


行长度

每行不超过80个字符
以下情况除外:
1、长的导入模块语句
2、注释里的URL

不要使用反斜杠连接行。
Python会将 圆括号, 中括号和花括号中的行隐式的连接起来 , 你可以利用这个特点. 如果需要, 你可以在表达式外围增加一对额外的圆括号。

1
2
3
4
5
推荐: foo_bar(self, width, height, color='black', design=None, x='foo',
emphasis=None, highlight=0)

if (width == 0 and height == 0 and
color == 'red' and emphasis == 'strong'):

查看更多

机器学习资料共享

链接相关

资料(课件、代码):http://pan.baidu.com/s/1mh8fuZm 密码:j7zf
软件(pycharm、注册码等):http://pan.baidu.com/s/1o8GyXkQ 密码:n2jg
视频(机器学习):http://pan.baidu.com/s/1sl0JMJr
这是最近买的付费教程,对资料感兴趣的可以在下方留下邮件地址,我会定期进行密码发送。


教程课表

第1 章 : 参课须知
课时1:参课须知

第2 章 : 第一周课件资料和视频
课时2:1.机器学习中的数学
课时3:1.机器学习中的数学(视频) 144:28
课时4:第一次作业
课时5:2.Python库
课时6:2.Python库(视频) 151:15
课时7:第二次作业
课时8:3.回归
课时9:3.回归(视频) 143:06
课时10:第三次作业

查看更多

微服务学习资料共享

技术应用背景介绍

微服务是一种软件架构风格,它是以专注于单一责任与功能的小型功能区块为基础,利用模组化的方式组合出复杂的大型应用程序,各功能区块使用与语言无关的 API 集相互通讯;微服务架构设计风格代表了下一代的架构设计思想,配合现在的容器工具(如Docker),可以在软件开发流程、部署、服务维护等各方面产生新的生产效率提升;通过微服务可以更好地体现业务逻辑、更快地交付软件,并且借助IAAS平台,能够快速地扩展服务支撑更大的访问流量压力。


课程内容简介

课程以架构设计历史简述为始,结合常用技术框架及工具帮助学员快速上手实现第一个微服务,再通过微服务实践过程中需要注意的数据模型、服务间通信等来进行多个微服务的设计实践,最后从测试、部署的角度来叙述在微服务最后上线及维护的相关事宜;课程将从“初始微服务”来简述服务架构设计风格的发展历程和微服务的由来;通过“Java与微服务”来介绍常用的快速上手Java微服务技术框架;通过“微服务间关系”、“数据模型设计与处理”、“微服务安全加固”课程来详细阐述微服务在实战过程中的原则和技巧;通过“微服务测试”、“微服务部署”、“微服务与虚拟化、容器化”课程来帮助学员掌握微服务测试到最后上线及服务的实践。

查看更多

数据库规约解读

适用场景:并发量大、数据量大的互联网业务


基础规范

1、必须使用InnoDB存储引擎
解读:支持事务、行级锁、并发性能更好、CPU及内存缓存页优化使得资源利用率更高

2、新库默认使用utf8mb4字符集
解读:utf8mb4和utf8都是万国码,无需转码,无乱码风险。其中utf8mb4是utf8的超集,emoji表情以及部分不常见汉字在utf8下会表现为乱码,故需要升级至utf8mb4。

3、数据表、数据字段必须加入中文注释
解读:N年后没谁知道这个r1,r2,r3字段是干嘛的。
不过也有人提出,加入注释会方便黑客,建议“注释写在文档里,文档和数据库同步更新”。
这个建议根据经验来说是不太靠谱的:
(1)不能怕bug就不写代码,怕黑客就不写注释,对吧?
(2)文档同步更新也不太现实,还是把注释写好,代码可读性做好更可行,互联网公司的文档管理?呆过互联网公司的同学估计都清楚

4、禁止使用存储过程、视图、触发器、Event
解读:军规的背景是“并发量大、数据量大的互联网业务”,这类业务架构设计的重点往往是吞吐量,性能优先(和钱相关的少部分业务是一致性优先),对数据库性能影响较大的数据库特性较少使用。这类场景的架构方向是“解放数据库CPU,把复杂逻辑计算放到服务层”,服务层具备更好的扩展性,容易实现“增机器就扩充性能”,数据库擅长存储与索引,勿让数据库背负过重的任务。

有人质疑某些军规不合理,完全做到不可能,任何事情都没有百分之百,针对业务特性设计架构,总有方案替代,等单库吞吐量到了几千上万,就明白这些军规的重要性了。

查看更多