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

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

从最后开始看tail -200 最后两百行,从前往后

lsof

lsof -i :端口号
image.pnghttps://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

tree -L 1 深度

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粘贴

x删除光标处的字符

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

包含很多特殊字符

用代码进行一下url编码

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

image.png
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)的值。

image.png

全连接队列的大小取决于: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

  1. [maintain@lf-op-dba2-mysql1-online ~]$ sudo yum install systemtap systemtap-runtime
  2. [maintain@lf-op-dba2-mysql1-online ~]$ sudo stap -v acceptq.stp
  3. Checking "/lib/modules/3.10.0-957.el7.x86_64/build/.config" failed with error: No such file or directory
  4. [maintain@lf-op-dba2-mysql1-online ~]$ sudo yum remove kernel-devel
  5. [maintain@lf-op-dba2-mysql1-online ~]$ stap-prep
  6. Need to install the following packages:
  7. kernel-3.10.0-957.el7.x86_64
  8. kernel-devel-3.10.0-957.el7.x86_64
  9. kernel-debuginfo-3.10.0-957.el7.x86_64
  10. https://people.centos.org/arrfab/shim/results/kernel/20181108233701/3.10.0-957.el7.x86_64/
  11. http://debuginfo.centos.org/7/x86_64/
  12. 后来发现是少了sudo yum -y install kernel-headers
  13. 装了还是不行,容器里没有/lib/modules目录
  14. stap -v -e 'probe vfs.read {printf("read performed\n"); exit()}'
  1. /*
  2. * Prints details on specifically what connections
  3. * suffered due to Accept Queue overflow. It can be greatly
  4. * useful for identifying periodically hung applications that
  5. * fails to accept() connections fast enough.
  6. *
  7. * Usage: stap acceptq.stp
  8. */
  9. probe begin {
  10. printf("time (us) \tacceptq\tqmax\tlocal addr\tremote_addr\n")
  11. }
  12. function skb_get_remote_v4addr:string(skb:long)
  13. {
  14. return format_ipaddr(__ip_skb_daddr(__get_skb_iphdr(skb)), 2 /* AF_INET */)
  15. }
  16. function skb_get_remote_v6addr:string(skb:long)
  17. {
  18. ipv6_hdr = &@cast(__get_skb_iphdr(skb), "ipv6hdr")
  19. return format_ipaddr(&ipv6_hdr->daddr, 10 /* AF_INET6 */)
  20. }
  21. function skb_get_remote_port:long(skb:long)
  22. {
  23. return __tcp_skb_sport(__get_skb_tcphdr(skb))
  24. }
  25. probe kernel.function("tcp_v4_conn_request") {
  26. if ($sk->sk_ack_backlog > $sk->sk_max_ack_backlog) {
  27. printf("%d\t%d\t%d\t%s:%d\t%s:%d\n",
  28. gettimeofday_us(),
  29. $sk->sk_ack_backlog,
  30. $sk->sk_max_ack_backlog,
  31. inet_get_ip_source($sk),
  32. inet_get_local_port($sk),
  33. skb_get_remote_v4addr($skb),
  34. skb_get_remote_port($skb));
  35. }
  36. }
  37. probe kernel.function("tcp_v6_conn_request") {
  38. if ($sk->sk_ack_backlog > $sk->sk_max_ack_backlog) {
  39. printf("%d\t%d\t%d\t[%s]:%d\t[%s]:%d\n",
  40. gettimeofday_us(),
  41. $sk->sk_ack_backlog,
  42. $sk->sk_max_ack_backlog,
  43. inet_get_ip_source($sk),
  44. inet_get_local_port($sk),
  45. skb_get_remote_v6addr($skb),
  46. skb_get_remote_port($skb));
  47. }
  48. }

top

https://unix.stackexchange.com/questions/147471/is-there-a-way-to-get-top-to-run-exactly-once-and-exit
top -bn1 仅输出一次

-H 输出线程信息

每隔一秒执行xxx

  1. #!/bin/sh
  2. while [ true ]; do
  3. echo "-----------------------------------------------------------------"
  4. echo "-------------------------now: $(date)----------------------------"
  5. top -H -bn 1| head -10
  6. netstat -s | egrep "listen|LISTEN"
  7. sleep 1
  8. done

同时后台运行:
sh shell > out.log &

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

修改时间为绝对时间
image.png

image.png

http 抓包

-port 80
发出的和返回的

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)

image.png

pstack

linux上任何语言的调用堆栈,包括java的也可以用。

pstack $pid > xxx.log

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
image.png

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}’