0%

线上问题排查

  • 先确定是不是CPU占比太高 使用top命令查看cpu的 %idle还有多少,如果idle过少,表示CPU使用率较高,按P用CPU排序,查看CPU占用多的进程。之后可以通过该文章【 CPU飙升 】来查找问题
  • 查看内存情况,使用 free -h 查看内存使用情况,如果剩余内存偏少,使用vmstat -n 1查看 si、so列的情况,确认是否内存不够用了。如果内存不够用了,使用top命令,按M用内存排序,查看内存占用多的进程
  • 查看网络连接,使用netstat -tnop | wc -l 查看tcp连接数,如果连接数过高,按照PID统计tcp连接数量 netstat -tnp | awk '{print $7}' | sort | uniq -c | sort -m,查看各个状态下的连接有多少个netstat -an|awk '/tcp/ {print $6}'|sort|uniq -c
  • 查看磁盘情况,使用iostat -d 1,查看kB_read/s kB_wrtn/s,如果磁盘读写频繁,找到大量写磁盘的进程,使用iotop或者ls -l /proc/*/fd或者pstack或者strace命令来查看

log4j2动态修改日志级别

有时候需要在线上环境排查问题,而一般情况下为了减少日志的输出,设置的日志级别较高,此时就需要一些方法来动态的调低日志级别排查问题。在log4j2中提供了Configurator来修改日志配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// 获取日志级别
@GetMapping(value = "/getLogLevel")
@ResponseBody
public String getLogLevel(@RequestParam(value = "package") String packageName) {
LOGGER.info("getLoglevel packageName is {}", packageName);
LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
return ctx.getLogger(packageName).getLevel().name();
}

// 设置日志级别
@PostMapping(value = "/setLoglevel")
@ResponseBody
public String setLoglevel(@RequestParam("loglevel") String logLevel, @RequestParam(value = "package") String packageName) {

LOGGER.info("setLoglevel packageName is {},logLevel is {}", packageName, logLevel);
try {
Configurator.setLevel(packageName, Level.valueOf(logLevel));
} catch (Exception e) {
LOGGER.error("设置失败 setLoglevel packageName is {},logLevel is {}", packageName, logLevel, e);
return "fail";
}
return "success";
}

python JSON解析

系统的记录的请求日志是json格式的,想在服务器上直接分析一下该日志,如果用linux命令的话太复杂了,还是使用python来比较简单。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/usr/bin/python3

import json

# 写入 JSON 数据
# with open('data.json', 'w') as f:
# json.dump(data, f)

file_path = "/data/req_resp.log"
file = open(file_path,"r")
# 读取所有行
lines = file.readlines()
for line in lines:
# print(type(line))
#转为json
data = json.loads(line)
# print(type(data))
# 获取timeSpent字段 在python3中判断是否存在某个字段 if 'timeSpent' in data
timeSpent = data['timeSpent']
# 只打印超过150ms的请求信息
if timeSpent > 150:
print (data)

TCP拥塞控制

拥塞控制考虑的是整个网络,全局性的考虑

拥塞控制的算法

  • 慢启动算法 由小到大逐渐增加发送数据量,每收到一个报文确认,就加一。增长到慢启动阈值就不增长了
  • 拥塞避免算法 当达到慢启动阈值之后,就采用拥塞避免算法,维护了一个拥塞窗口变量,只要网络不拥塞,就试探着拥塞窗口调大

TCP流量控制

流量控制考虑的是点对点的通信量的控制

TCP的流量控制是通过滑动窗口来实现的,通过窗口的大小来控制对方的发送速率