sysbench
sysbench —db-driver=mysql —mysql-host=pc-xxx.rwlb.rds.aliyuncs.com —mysql-port=3306—mysql-user=user —mysql-password=’password’—mysql-db=testdb —table_size=20000000—tables=10—events=0—time=600—threads=30—percentile=95—report-interval=1 oltp_write_only run
ls -lrth
grep
-n
grep -n “文本” 文件名 显示在源文件中的行号
grep ‘2018-Nov-06 11:3[4-7]’ shop-bussiness.log.2018-11-06
grep 23:[00-59] zdal-db-digest.log
-C 数字 往后数行,-A 前后数n行 / -数字
$grep -5 ‘parttern’ inputfile //打印匹配行的前后5行
-c 计数
-r 递归
-i 不区分大小写
grep -e xxx -e yyy 或者
cut
$ cat openapi-client.log.2018-04-26|grep querySecurityList | cut -d ‘,’ -f 18 |grep -oP ‘[\d.]+’ |awk ‘{sum+=$1} END {print “Average = “, sum/NR}’
awk
awk -F : ‘{print $2}’
awk -F ‘,’ ‘{print $6}’ | awk ‘{sum += $1} END {print “sum = “ sum}’
less
xargs(可以在批量文件中使用文本处理命令,如从find开始)
find . -name “.xml” | xargs grep drmUrl
cd /home/admin/logs find . -name “.log” | xargs grep traceid
kubectl get po -n kube-system -owide |grep yoda-agent |grep a34g13120.cloud.g14.amtest66| awk ‘{print $1}’|xargs kubectl delete po -n kube-system —force —grace-period=0
more
tail
lsof
lsof -i :端口号https://www.jianshu.com/p/a3aa6b01b2e1
scp
scp 文件名 用户名@IP:dir 本地拷贝到远程scp 用户名@IP:文件名 dir 远程拷贝到本地
pgm
pgm -b -f tel.list “rm -f /home/admin/tel/logs/tel-error.log.*”
wc -l
sed
[root@www ~]# sed [-nefr] [动作]选项与参数:-n :使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN 的数据一般都会被列出到终端上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。-e :直接在命令列模式上进行 sed 的动作编辑;-f :直接将 sed 的动作写在一个文件内, -f filename 则可以运行 filename 内的 sed 动作;-r :sed 的动作支持的是延伸型正规表示法的语法。(默认是基础正规表示法语法)-i :直接修改读取的文件内容,而不是输出到终端。
动作说明: [n1[,n2]]functionn1, n2 :不见得会存在,一般代表『选择进行动作的行数』,举例来说,如果我的动作是需要在 10 到 20 行之间进行的,则『 10,20[动作行为] 』
function:a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~c :取代,加载更多
tar
压缩:tar czvf my.tar dir1 dir2
解压:tar xzvf my.tar
.tar:tar -zxvf xxx.tar -C 某个目录 解压到某个目录下
.tar.gz:tar -xvf
内存
free -m
https://blog.csdn.net/claram/article/details/102709781
tree
less
往后翻一页 空格
往后翻一行 回车
往前翻一页 u
往前翻一行 y
OOM问题
grep -i ‘killed process’ /var/log/messages
或者
dmesg -T | egrep -i ‘killed process’
[Mon Apr 19 04:04:08 2021] Killed process 141337 (salt-minion) total-vm:699544kB, anon-rss:34432kB, file-rss:0kB, shmem-rss:0kB
[Mon Apr 19 04:06:32 2021] Killed process 346561 (java) total-vm:38674656kB, anon-rss:12449844kB, file-rss:1036kB, shmem-rss:0kB
[Mon Apr 19 04:06:33 2021] Killed process 346555 (salt-minion) total-vm:408200kB, anon-rss:19092kB, file-rss:108kB, shmem-rss:0kB
[Mon Apr 19 04:26:44 2021] Killed process 19497 (java) total-vm:38743256kB, anon-rss:12456416kB, file-rss:1256kB, shmem-rss:0kB
JVM相关
开debug端口
-Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=8000,suspend=y
jmap -histo[:live] pid 实时查看内存
jmap -dump:file=a.dump pid dump堆内存
vi
光标跳转到行尾:shift + 4 即 $
dd 删除
p 粘贴刚才删掉的一行
vim 跳到行首 : 数字 0
vim跳到行尾 : $ 【Shift + 4】
调到行尾并且开启insert模式:大写A
yy复制
p粘贴
curl
curl -X POST -H “Content-Type: application/json” -d hello http://localhost:9090/save
如果curl一个java的http服务没有任何响应,有可能是没有将空格转义为%20。
curl “http://localhost:8080/shardingquery?group=123&key=345&sql=update%20t1%20set%20a%20=%201;select%201”
curl -s -X GET localhost:8080/data-migration-manager/webapi/taskGroups | python -m json.tool
curl -s -X GET “localhost:8080/data-migration-manager/webapi/taskGroups/tg-trans-OGk21o” | python -m json.tool
curl -s -X POST “localhost:8080/data-migration-manager/utilapi/data_preparation?dbkey=maintain_migration_loadtest_src-6j4dLD-test&count=10000000&clear=true” | python -m json.tool
curl -s -X POST “localhost:8080/data-migration-manager/utilapi/data_clean?dbkey=maintain_migration_loadtest_target_shard-SUCAm8-test” | python -m json.tool
curl -s -X POST -H “Content-Type: application/json” “localhost:8080/data-migration-manager/webapi/taskGroups/tasks/transmission?name=xinjiantest_transmission” -d ‘{
“sourceDbKey”: “maintain_migration_loadtest_source-Dz274d-test”,
“targetDbKey”: “maintain_migration_loadtest_target_shard-SUCAm8-test”,
“tables”: [“user”],
“channelNum”: 16,
“tableColumns”: null,
“batchSize”: 4096,
“shardingBatchSize”: 512
}’ | python -m json.tool
curl -s -X POST -H “Content-Type: application/json” “localhost:8080/data-migration-manager/webapi/taskGroups/tasks/check?name=xinjiantest_check” -d ‘{
“leftDbKey”: “maintain_migration_loadtest_source-Dz274d-test”,
“rightDbKey”: “maintain_migration_loadtest_target_shard-SUCAm8-test”,
“scanStrategy”: “SELECT_RANGE_BY_PK_ON_BOTH_SIDES”,
“parallelism”: 20,
“retryTimes”: 2,
“tables”: [“user”],
“ignoreColumns”: null,
“tableUkColumnsMappings”: null
}’ | python -m json.tool
curl -I 查看HTTP 响应头信息
空格:%20
展示响应头(包括状态码等):-I
curl ‘http://shardingquery-sg.zhenguanyu.com/shardingquery?group=conan-mission&key=sg_mission_sharding_jdbc_config&sql=select+now%28%29&ak=LTBI4GEmReB8GsmLMoMukEpW&sig=43PG6szVWH0GkRWXqEoY35iokos%3D&targetRegion=sg’ -I
HTTP/1.1 510
Server: openresty
Date: Tue, 22 Mar 2022 07:48:51 GMT
Content-Length: 0
Connection: keep-alive
包含很多特殊字符
TCP accept queue
netstat -s | egrep “listen|LISTEN”
667399 times the listen queue of a socket overflowed
667399 SYNs to LISTEN sockets ignored
比如上面看到的 667399 times ,表示全连接队列溢出的次数,隔几秒钟执行下,如果这个数字一直在增加的话肯定全连接队列偶尔满了。
全连接队列(accept queue)满了的话,会导致客户端认为established,然后服务端的accept()实际上是没有机会返回,也就不会在服务端进行处理了,后续只能等tcp连接被关掉,客户端才能从等待中恢复;
半连接队列(syn queue)满了的话,服务端不会发送syn+ack,客户端会一直处于syn_sent状态,持续重发syn。
当tcp_abort_on_overflow=0,服务accept 队列满了,客户端发来ack,服务端直接丢弃该ACK,此时服务端处于【syn_rcvd】的状态,客户端处于【established】的状态。在该状态下会有一个定时器重传服务端 SYN/ACK 给客户端(不超过 /proc/sys/net/ipv4/tcp_synack_retries 指定的次数,Linux下默认5)。超过后,服务器不在重传,后续也不会有任何动作。如果此时客户端发送数据过来,服务端会返回RST。(这也就是我们的异常原因了)
当tcp_abort_on_overflow=1,服务端accept队列满了,客户端发来ack,服务端直接返回RST通知client,表示废掉这个握手过程和这个连接,client会报connection reset by peer。
/proc/sys/net/ipv4/tcp_abort_on_overflow
/proc/sys/net/ipv4/tcp_max_syn_backlog
net.core.somaxconn
如果文件没有,就sysctl -a | grep xxx(参数名称),如
sysctl -a | grep somaxconn
sysctl -a | grep tcp_abort_on_overflow
https://zhuanlan.zhihu.com/p/87437843
ss -lnt
Recv-Q Send-Q Local Address:Port Peer Address:Port
0 50 :3306 :*
上面看到的第二列Send-Q 表示第三列的listen端口上的全连接队列最大为50,第一列Recv-Q为全连接队列当前使用了多少
(listen状态)
- Recv-Q:表示的是当前等待server端调用accept完成三次握手的listen backlog数值,也就是说,当客户端发送syn给server端,server端接收到syn存放的半连接队列(SYN queue)的当前值。
- Send-Q:表示全连接队列(accept queue)上限的数值,min(backlog,somaxconn)的值。
全连接队列的大小取决于:min(backlog, somaxconn) . backlog是在socket创建的时候传入的,somaxconn是一个os级别的系统参数
半连接队列的大小取决于:max(64, /proc/sys/net/ipv4/tcp_max_syn_backlog)。 不同版本的os会有些差异
stap(SystemTap)
sudo stap -v acceptq.stp
https://zhuanlan.zhihu.com/p/87437843
[maintain@lf-op-dba2-mysql1-online ~]$ sudo yum install systemtap systemtap-runtime
[maintain@lf-op-dba2-mysql1-online ~]$ sudo stap -v acceptq.stp
Checking "/lib/modules/3.10.0-957.el7.x86_64/build/.config" failed with error: No such file or directory
[maintain@lf-op-dba2-mysql1-online ~]$ sudo yum remove kernel-devel
[maintain@lf-op-dba2-mysql1-online ~]$ stap-prep
Need to install the following packages:
kernel-3.10.0-957.el7.x86_64
kernel-devel-3.10.0-957.el7.x86_64
kernel-debuginfo-3.10.0-957.el7.x86_64
https://people.centos.org/arrfab/shim/results/kernel/20181108233701/3.10.0-957.el7.x86_64/
http://debuginfo.centos.org/7/x86_64/
后来发现是少了sudo yum -y install kernel-headers
装了还是不行,容器里没有/lib/modules目录
stap -v -e 'probe vfs.read {printf("read performed\n"); exit()}'
/*
* Prints details on specifically what connections
* suffered due to Accept Queue overflow. It can be greatly
* useful for identifying periodically hung applications that
* fails to accept() connections fast enough.
*
* Usage: stap acceptq.stp
*/
probe begin {
printf("time (us) \tacceptq\tqmax\tlocal addr\tremote_addr\n")
}
function skb_get_remote_v4addr:string(skb:long)
{
return format_ipaddr(__ip_skb_daddr(__get_skb_iphdr(skb)), 2 /* AF_INET */)
}
function skb_get_remote_v6addr:string(skb:long)
{
ipv6_hdr = &@cast(__get_skb_iphdr(skb), "ipv6hdr")
return format_ipaddr(&ipv6_hdr->daddr, 10 /* AF_INET6 */)
}
function skb_get_remote_port:long(skb:long)
{
return __tcp_skb_sport(__get_skb_tcphdr(skb))
}
probe kernel.function("tcp_v4_conn_request") {
if ($sk->sk_ack_backlog > $sk->sk_max_ack_backlog) {
printf("%d\t%d\t%d\t%s:%d\t%s:%d\n",
gettimeofday_us(),
$sk->sk_ack_backlog,
$sk->sk_max_ack_backlog,
inet_get_ip_source($sk),
inet_get_local_port($sk),
skb_get_remote_v4addr($skb),
skb_get_remote_port($skb));
}
}
probe kernel.function("tcp_v6_conn_request") {
if ($sk->sk_ack_backlog > $sk->sk_max_ack_backlog) {
printf("%d\t%d\t%d\t[%s]:%d\t[%s]:%d\n",
gettimeofday_us(),
$sk->sk_ack_backlog,
$sk->sk_max_ack_backlog,
inet_get_ip_source($sk),
inet_get_local_port($sk),
skb_get_remote_v6addr($skb),
skb_get_remote_port($skb));
}
}
top
https://unix.stackexchange.com/questions/147471/is-there-a-way-to-get-top-to-run-exactly-once-and-exit
top -bn1 仅输出一次
-H 输出线程信息
每隔一秒执行xxx
#!/bin/sh
while [ true ]; do
echo "-----------------------------------------------------------------"
echo "-------------------------now: $(date)----------------------------"
top -H -bn 1| head -10
netstat -s | egrep "listen|LISTEN"
sleep 1
done
tcpdump & wireshark
https://blog.csdn.net/ffggnfgf/article/details/51056053
客户端:
- 只抓发出的:
- tcpdump tcp -i lo0 -s 0 -l dst port 3306 and host mysql的ip -w client.cap
- 同时抓发出的和收到的:
- tcpdump tcp -i lo0 -s 0 -l port 3306 and host mysql的ip -w ~/dev/client.cap
MySQL端:
- 只抓发出的:
- tcpdump tcp -i lo0 -s 0 -l src port 3306 and host 客户端ip -w ~/dev/server.cap
- 同时抓:
- tcpdump tcp -i lo0 -s 0 -l port 3306 and host 客户端ip -w ~/dev/server.cap
注意-i 必须要指定(值可以写any)。
wireshark
过滤表达式
ip.src == xxx and ip.dst ==yyy
http contains “HTTP/1.1 406” and ip.dst==10.11.94.121
http and http.contains xxx
修改时间为绝对时间
http 抓包
https 抓包
https://blog.csdn.net/javajiawei/article/details/72380632
-port 443
发出的和返回的
但是注意不能直接解密,还需要一个ssl key log文件。
vim /etc/profile
export SSLKEYLOGFILE=”/root/path/to/sslkeylog.txt”
客户端生成随机密码,即SSLKEYLOGFILE的值。 客户端使用公钥加密(实际是使用公钥去加密随机密码,即SSLKEYLOGFILE的值)。服务器使用私钥解密(实际是使用私钥解密随机密码,即SSLKEYLOGFILE的值)。
使用随机密码,即SSLKEYLOGFILE的值,去加密/解密通信。
[
](https://blog.csdn.net/jamie1025/article/details/109823026)
pstack
linux上任何语言的调用堆栈,包括java的也可以用。
strace
跟踪进程的系统调用。
https://www.cnblogs.com/ggjucheng/archive/2012/01/08/2316692.html
strace -o strace.log -tt -T -p 24298
java服务的话还要加 -f(包括子进程)
https://www.cnblogs.com/machangwei-8/p/10388883.html
https://www.cnblogs.com/ggjucheng/archive/2012/01/08/2316692.html
-eopen等价于 -e trace=open,表示只跟踪open调用.而-etrace!=open表示跟踪除了open以外的其他调用.有两个特殊的符号 all 和 none. 注意有些shell使用!来执行历史记录里的命令,所以要使用\.
-e trace=set
只跟踪指定的系统 调用.例如:-e trace=open,close,rean,write表示只跟踪这四个系统调用.默认的为set=all.
-e trace=file
只跟踪有关文件操作的系统调用.
-e trace=process
只跟踪有关进程控制的系统调用.
-e trace=network
跟踪与网络有关的所有系统调用.
-e strace=signal
跟踪所有与系统信号有关的 系统调用
-e trace=ipc
跟踪所有与进程通讯有关的系统调用
-e abbrev=set
设定 strace输出的系统调用的结果集.-v 等与 abbrev=none.默认为abbrev=all.
-e raw=set
将指 定的系统调用的参数以十六进制显示.
-e signal=set
指定跟踪的系统信号.默认为all.如 signal=!SIGIO(或者signal=!io),表示不跟踪SIGIO信号.
-e read=set
输出从指定文件中读出 的数据.例如:
-e read=3,5
-e write=set
输出写入到指定文件中的数据.
-o filename
将strace的输出写入文件filename
-p pid
跟踪指定的进程pid.
-s strsize
指定输出的字符串的最大长度.默认为32.文件名一直全部输出.
-u username
以username 的UID和GID执行被跟踪的命令
perf
https://zhuanlan.zhihu.com/p/141694060?from_voters_page=true
https://www.ruanyifeng.com/blog/2017/09/flame-graph.html
https://segmentfault.com/a/1190000023103508
https://blog.csdn.net/zhangskd/article/details/37902159
perf stat -p $pid
perf record -F 99 -g -p $pid
perf record -F 99 -g -p $pid -t $线程id
perf report -n —stdio
rsync cp的一个替代,可以exclude
rsync -av —progress sourcefolder /destinationfolder —exclude thefoldertoexclude
json格式化
cat xxx | python -m json.tool
环境变量
source key=value 添加、修改环境变量
unset key 删除环境变量
traceroute nslookup
iptables
iptables -t 表名 <-A/I/D/R> 规则链名 [规则号] <-i/o 网卡名> -p 协议名 <-s 源IP/源子网> —sport 源端口 <-d 目标IP/目标子网> —dport 目标端口 -j 动作
执行“iptables -I INPUT -p tcp —dport 12345 -i eth0 -j REJECT”,设置对于接收的TCP协议数据包,若目标端口为12345,且网络接口为eth0时则拒绝。
会导致本机可以访问本机的12345端口,经过eth0网络接口的其他机器不可访问本机的12345端口。
执行“iptables -I INPUT -p tcp —dport 12345 -i lo -j REJECT”,设置对于接收的TCP协议数据包,若目标端口为12345,且网络接口为回环接口lo时则拒绝。
会导致本机不可访问本机的12345端口,经过eth0网络接口的其他机器可以访问本机的12345端口。
执行“iptables -I OUTPUT -p tcp —sport 12345 -o eth0 -j REJECT”,设置对于发送的TCP协议数据包,若源端口为12345,且网络接口为eth0时则拒绝。
会导致本机可以访问本机的12345端口,经过eth0网络接口的其他机器不可访问本机的12345端口。
执行“iptables -I OUTPUT -p tcp —sport 12345 -o lo -j REJECT”,设置对于发送的TCP协议数据包,若源端口为12345,且网络接口为回环接口lo时则拒绝。
会导致本机不可以访问本机的12345端口,经过eth0网络接口的其他机器可访问本机的12345端口。
————————————————
版权声明:本文为CSDN博主「adrninistrat0r」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/a82514921/article/details/104616548
awk算均值
grep xxx_url xxx.log | grep sc=200 | grep -Eo ‘duration=[0-9]+’ | grep -Eo ‘[0-9]+’ | awk ‘{sum += $1} END {if(NR>0) {print sum/NR} else {print 0}}’
多文件合并之后过滤去重(多文件时,要先排序再去重)
cat http-request-fenbi-oss* | awk -F ‘bucket=’ ‘{print $2}’ | awk -F ‘ ‘ ‘{print $1}’ | sort | uniq -c
awk 按照条件过滤
grep ‘18:0’ http-request-fenbi-oss.log | awk -F ‘ ‘ ‘{print $6,$12}’ | awk -F ‘=’ ‘{if($3 > 3000) print $0}’