0%

在定位 Linux 性能问题时,经常需要排查是哪个进程造成的系统资源(CPU、内存)过高。

这里提供一个脚本,可方便的进行持续的 top 监控,将监控结果按时间戳命名,保存到文件。

后续,可通过 grep 命令或脚本解析进行问题定位。

主要功能

  • 输出完整 top 进程列表
  • 支持自定义采集间隔
  • 支持删除过期日志

脚本

top_monitor.sh 脚本如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#! /bin/bash

#############################################################
#
# Monitor top to file, YYYYmmdd_HHMMSS.txt
#
#
# usage:
# nohup ./top_monitor.sh [outputdir] &
# params:
# outputdir: optional, default: /var/log/top_monitor/
#
#
# author: liangxinhui@qq.com
#
# version: 0.1 2020-04-11
#
#############################################################

# use first argument as output dir,
# if not set, use a default path
OUTPUTDIR=$1
if [ ! $OUTPUTDIR ]; then
OUTPUTDIR=/var/log/top_monitor/
fi

# monitor interval
SLEEP_SECONDS=30
# max keep file time, set to 0 for all
# check interval = 100 * SLEEP_SECONDS
KEEP_FILE_MINUTES=0

mkdir -p $OUTPUTDIR

export COLUMNS=1024

for ((i=0;;i++ ));
do

DATETIME=$(date +%Y%m%d_%H%M%S)
top -b -c -n 1 > $OUTPUTDIR/top_${DATETIME}.txt

# remove old log files
if [ $KEEP_FILE_MINUTES -gt 0 -a `expr $i % 100` == 0 ]; then
find $OUTPUTDIR -type f -mmin +$KEEP_FILE_MINUTES -delete
fi

sleep $SLEEP_SECONDS
done

在执行 nohup python my_script.py & 时,生成的 nohup.out 文件为空。

原因是:stdout 没有及时 flush

解决办法:添加python启动参数-u

参数说明:

# python --help
...
-u     : force the binary I/O layers of stdout and stderr to be unbuffered;
         stdin is always buffered; text I/O layer will be line-buffered;
         also PYTHONUNBUFFERED=x
...

参考链接:
https://stackoverflow.com/questions/25674613/python-nohup-out-dont-show-print-statement

安装 kubernetes 时需要关掉swap, Ubuntu 18.04 下关闭 swap 的操作:

1
2
3
4
5
6
7
8
# 查看是否有swap(返回空表示没有),也可以使用 top/free 查看
sudo swapon --show
# 关掉 swap
sudo swapoff -v /swap.img
# 修改 fstab ,取消启动挂载
vim /etc/fstab
# 删除交换分区文件
rm -rf /swap.img

/swap.imgubuntu 18.04 默认的 swap 文件。其他场景可通过cat /etc/fstab 查看。

关于swap更多操作, 参考:

https://www.sysgeek.cn/ubuntu-18-04-swap/

在Shell中,我们可以用awk实现按列求和的功能,非常简单。看下面的例子:

1.简单的按列求和

1
2
3
4
5
6
7
[linux@test /tmp]$ cat test
123.52
125.54
126.36

[linux@test /tmp]$ awk '{sum += $1};END {print sum}' test
375.42

2.对符合某些条件的行,按列求和

1
2
3
4
5
6
[linux@test /tmp]$ cat test
aaa 123.52
bbb 125.54
aaa 123.52
aaa 123.52
ccc 126.36

对文件test中 第一列为aaa的行求和

1
2
[linux@test /tmp]$ awk '/aaa/ {sum += $2};END {print sum}' test
370.56

awk 处理文本还是很方便的。
————————————————
版权声明:本文为CSDN博主「默一鸣」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/yimingsilence/article/details/77163585

通过tar命令备份、解压缩文件,也可在不解压缩文件时查看包内的文件信息。

使用如下参数:

tar -ztvf file.tar.gz

将列出所有包内的文件列表,包括目录

-z, --gzip, --gunzip, --ungzip	filter the archive through gzip
-t, --list	                    list the contents of an archive
-v, --verbose	                 verbosely list files processed
-f, --file=ARCHIVE	            use archive file or device ARCHIVE

以上内容, 转自: https://www.cnblogs.com/0820LL/p/9620158.html


如果想查看文件压缩前后整体大小、压缩率等,可以使用:

gzip -l file.tar.gz