Linux 性能监测

free

free命令可以用来查看系统内存使用情况。如果swap行数据都是0,表明没有创建和挂载交换区。当系统可用内存非常少时,系统可能会动用交换区,这时会增加I/O开销。
命令参数:
–help 帮助
-h show human-readable output
-b  以Byte为单位显示内存使用情况。
-k  以KB为单位显示内存使用情况。
-m  以MB为单位显示内存使用情况。
-g 以GB为单位显示内存使用情况。
-o  不显示缓冲区调节列。
-s<间隔秒数>  持续观察内存使用状况。
-t  显示内存总和列。
-V  显示版本信息。
显示列:
total:总的物理内存,used:使用中的内存,free:完全空闲的内存
available:开启一个新程序能够使用的最大内存。
shared:用于进程之间相互共享数据。
buffer与cache的区别是:buffer是将要向磁盘写的数据,cache是从磁盘读出的数据。
计算关系:total=used+free+buff/cache。

top

top命令包含了系统全局的很多指标信息,包括系统负载情况、系统内存使用情况、系统CPU使用情况等,可以相对全面地查看系统负载的来源,对不同的列排序,可以方便地查找出诸如内存占用最多的进程、 CPU占用率最高的进程等。 但top命令是一个瞬时输出的值,最好通过定时存储其值到文件中来进行对比诊断。
显示解释:
第一行内容有:当前系统时间、系统运行时长、当前登录系统用户数、1分钟、5分钟、15分钟的负载情况。
load average数据是每隔5秒钟检查一次活跃的进程数,然后按特定算法计算出的数值。如果这个数除以逻辑CPU的数量,结果高于5就表明系统在超负荷运转。

top命令是Linux上进行系统监控的首选命令,但top命令的监控最小单位是进程,所以看不到程序的线程数和客户连接数,通常可以ps和netstate两个命令来补充top的不足。

CentOS详解top命令各个数据的含义
https://www.cnblogs.com/ronli/p/centos-top.html

top交互命令

在top命令执行过程中可以使用的一些交互命令。这些命令都是单字母的,如果在命令行中使用了-s选项, 其中一些命令可能会被屏蔽。

h:显示帮助画面,给出一些简短的命令总结说明;
k:终止一个进程;
i:忽略闲置和僵死进程,这是一个开关式命令;
q:退出程序;
r:重新安排一个进程的优先级别;
S:切换到累计模式;
s:改变两次刷新之间的延迟时间(单位为s),如果有小数,就换算成ms。输入0值则系统将不断刷新,默认值是5s;
f或者F:从当前显示中添加或者删除项目;
o或者O:改变显示项目的顺序;
l:切换显示平均负载和启动时间信息;
m:切换显示内存信息;
t:切换显示进程和CPU状态信息;
c:切换显示命令名称和完整命令行;
M:根据驻留内存大小进行排序;
P:根据CPU使用百分比大小进行排序;
T:根据时间/累计时间进行排序;
w:将当前设置写入~/.toprc文件中。
shift+m: 按内存占用比排序

top显示结果字段含义

列名 含义
PID 进程ID
USER 进程所有者的用户名
PR 任务优先级
NI nice值,数值越小表示优先级越高。
VIRT 进程使用的虚拟内存总量。单位:kb,VIRT=SWAP+RES。
RES 进程使用的、未被换出的物理内存大小。单位:kb,RES=CODE+DATA。
SHR 共享内存大小。单位:kb。
S 进程状态,表示如下:
D= 不可中断的睡眠状态
R= 运行
S= 睡眠
T= 跟踪 / 停止
Z= 僵尸进程
%CPU 上次更新到现在的 CPU 时间占用百分比。
TIME+ 进程使用的 CPU 时间总计,精确到 1/100 秒
COMMAND 命令名 / 命令行

其它命令

uptime 可以快速查看服务器的负载情况。
dmesg | tail,该命令会输「H系统日志的最后10行,常见的OOMkill和TCP丢包在这里都会有记录。
vmstat 是一个实时性能检测工具,展现给定时间间隔服务器的状态值,包括服务器的CPU使用率、内存使用、虚拟内存交换情况、I/O读写情况等系统核心指标。
mpstat -P ALL 1,该命令用来显示每个 CPU 的使用情况。
sar -n DEV 1,sar命令主要用来查看网络设备的吞吐率。可以通过网络设备的吞吐率,判断网络设备是否已经饱和。

测试工具

《Linux就该这么学》 https://www.linuxprobe.com/chapter-00.html

siege用于压测
VisualVm用于监测

性能检测工具:
vmstat命令可以输出cpu、内存采样,例如每秒采样一次: vmstat 1。
iostat命令可以输出磁盘的信息,比如使用率、IOPS和数据吞吐量等。

时序数据库

influxdb

measurement和tags共同称为key,如果在tag value中的空格,应以“\”加上空格表示。
tag中的值必须是string类型,其实是起到索引的作用。

field中的值可以为Integer、float、Boolean、string类型。若为Integer类型,则值后必须加“i”,否则该值为float类型,Boolean类型的值的表示方式有很多,直接写成:t、T、true、TRUE, 和 f、F、false、FALSE。
插入数据时,时间戳部分如果被省略,则默认将当前时间的时间戳插入数据库,否则按照用户输入的时间戳插入。

influxDB属于时序数据库,没有提供修改和删除数据的方法。但是删除可以通过InfluxDB的数据保存策略(Retention Policies)来实现。
测试发现,重写同一条记录可覆盖上一条记录,可以做到修改这条记录。
另外分析,从系统整体上来看,updateTime并没有使用到,因为实时数据并不再从数据库中查询获得,而是使用内存中的最新采集数据。查询统计时使用的时间是createTime。
如果不记录updateTime,并且如果最新采集数据一直没有特征变化,最终数据库中存储的可能是较早期采集插入的数据。
如果不记录updateTime,并且如果要存储最后一次采集时间,可额外记录。一般情况下,当前时间即是最新一条记录的修改时间,下一条数据的创建时间减去采集周期是上一条数据的最后修改时间。

wget https://dl.influxdata.com/influxdb/releases/influxdb-1.5.2.x86_64.rpm
sudo yum localinstall influxdb-1.5.2.x86_64.rpm
service influxdb start

#命令行连接
influx -precision rfc3339
drop database mydb1
CREATE DATABASE mydb1
SHOW DATABASES 
USE mydb1
SHOW MEASUREMENTS
drop measurement measurement1

#增加数据采用insert的方式,表名与数据之间用逗号(,)分隔,tag和field之间用 空格分隔,多个tag或者多个field之间用逗号(,)分隔。
INSERT measurement1,field1=serverA,field1=us_west field3=0.64

select * from "measurement1"
select * from measurement1 limit 1
select * from "measurement1" where "value">0.9  

#series表示表里面的数据,series主要通过tags排列组合算出来。
show series from measurement1

InfluxDB简明手册
https://legacy.gitbook.com/book/xtutu/influxdb-handbook/details

使用influxdb和grafana快速开发监控系统
http://0x0010.com/2017/07/monitor-system-based-on-influxdb-grafana/
https://github.com/miwurster/spring-data-influxdb
https://docs.influxdata.com/influxdb/v1.5/guides/writing_data/
https://docs.influxdata.com/influxdb/v1.5/tools/api_client_libraries/
一篇文章告诉你,为什么时序数据库会成为新趋势?
http://www.tuicool.com/articles/r6R3aaY
http://flacro.me/influxdb/
Grafana的安装(CentOS )- 千月带你美化监控数据 grafana(1)
https://blog.csdn.net/syshzbtt/article/details/71574204
### NOT starting grafana-server by default on bootup, please execute
sudo /sbin/chkconfig –add grafana-server
### In order to start grafana-server, execute
sudo service grafana-server start

InfluxDB系列学习教程目录
https://www.linuxdaxue.com/influxdb-study-series-manual.html
使用 InfluxDB 有感
https://toutiao.io/posts/viqzdg/preview
https://www.jianshu.com/p/d71646c08317
https://www.jianshu.com/p/a1344ca86e9b

Spring Boot 应用属性配置

Spring Boot程序默认从application.properties或者application.yaml读取配置。

变量名引用

在application.properties文件中,使用${变量名}引用变量。例如:
db.name=db1
spring.data.mongodb.uri=mongodb://${db.username}:${db.password}@${db.url}:${db.port}/${db.name}
还可以自定义 application.properties 进行外部配置。
https://blog.csdn.net/fanhenghui/article/details/77447918

配置日志

一般程序入口要有日志,记录传入的数据是什么;部分重要的处理逻辑要有日志输出;程序出口也要有日志,记录其最终的处理结果。这样在解决生产上的问题时,可以很快的定位问题的位置,是传入数据的问题还是代码逻辑写错了。
在生产上严禁使用System.out输出,性能太低,原因是System.out输出会导致线程等待(同步),而使用Logger输出线程不等待日志的输出(异步),而继续执行。

#debug=true
logging.file=yirui_clock_server.log
logging.level.com.yirui.clock.server=INFO
logging.level.root=INFO
logging.level.org.springframework.data.mongodb=INFO

配置ssl、配置https

#配置.p12自签名证书
server.ssl.key-store: /etc/letsencrypt/live/xxxx/keystore.p12
server.ssl.key-store-password: jsqc
server.ssl.keyStoreType: PKCS12
server.ssl.keyAlias: tomcat
#配置.pfx证书
server:
  ssl:
    key-store: /opt/ssl/tomcat/xxx.pfx
    key-store-password: 25tUhz9Q
    keyStoreType: PKCS12

容器配置

Spring Boot 内置的容器有三个分别是Undertow、Jetty、Tomcat。Spring Boot 对这三个容器分别进行了实现,它们上层接口都是EmbeddedServletContainerFactory。

对于内置容器的定制与优化主要有两种方式:第一种方式是通过配置文件来配置,另外一种是通过码代码的方式。
配置的核心内容参考org.springframework.boot.autoconfigure.web.ServerProperties这个服务属性类。

spring boot 限制初始值大小及参数中文详解 https://www.jianshu.com/p/552e49571893

静态资源路径配置

spring.mvc.static-path-pattern 用于阐述静态资源的HTTP映射路径
spring.resources.static-locations 用于描述静态资源文件的存放位置

以jar包发布项目时,可以把静态资源文件存储为与jar包同级的static目录中,因此需要在jar包中配置静态资源路径。
#设置静态资源路径,多个以逗号分隔
spring.resources.static-locations=classpath:static/,file:static/

如果在不同的目录中存在多个配置文件,读取顺序是:
1、config/application.properties(项目根目录中config目录下)
2、config/application.yml
3、application.properties(项目根目录下)
4、application.yml
5、resources/config/application.properties(项目resources目录中config目录下)
6、resources/config/application.yml
7、resources/application.properties(项目的resources目录下)
8、resources/application.yml

或者Spring程序会按优先级从下面这些路径来加载application.properties配置文件:
当前目录下的/config目录
当前目录
classpath里的/config目录
classpath 跟目录

SpringBoot项目默认配置文件放置在“项目的resources目录下”。
同一个目录下,先读取application.properties,再读取gapplication.yml。
同一个配置属性,在多个配置文件都配置了,使用第一个读取到的值,后面读取的值不覆盖前面读取到的值。

指定配置文件

java -jar xxx.jar –spring.config.location=classpath:/default.properties,classpath:/override.properties
或者
java -jar -Dspring.config.location=D:\config\config.properties xxx.jar
还能在代码里指定
@SpringBootApplication
@PropertySource(value={“file:config.properties”})

运行时命令行中指定配置文件,jar包中的配置文件则全部失效了。

java -jar -Dspring.config.location=application-outside.properties 
xxx.jar

从命令行指定配置项的优先级最高,不过可以通过setAddCommandLineProperties来禁用命令行配置:
SpringApplication.setAddCommandLineProperties(false);

按Profile不同环境读取不同配置,可以在application.properties中指定使用哪一个文件
spring.profiles.active = dev
也可以在运行的时候手动指定:
java -jar
xxx.jar –spring.profiles.active = prod