MySQL
mysql导出csv文件
mysql -uroot -p1111 dbname -e "select * from table_a;" --default-character-set=gbk | sed 's#"#!!!!!#g;s/\t/","/g;s/^/"/;s/$/"/;s/\n//g' > test.csv
arthas
启动 arthas
在命令行下面执行(使用和目标进程一致的用户启动,否则可能 attach 失败):
curl -O https://arthas.aliyun.com/arthas-boot.jar
java -jar arthas-boot.jar --repo-mirror aliyun --use-http
· 执行该程序的用户需要和目标进程具有相同的权限。比如以admin用户来执行:sudo su admin && java -jar arthas-boot.jar 或 sudo -u admin -EH java -jar arthas-boot.jar。
· 如果 attach 不上目标进程,可以查看~/logs/arthas/ 目录下的日志。
· 如果下载速度比较慢,可以使用 aliyun 的镜像:java -jar arthas-boot.jar --repo-mirror aliyun --use-http
java -jar arthas-boot.jar -h 打印更多参数信息。
离线安装arthas
https://github.com/alibaba/arthas/releases/download/arthas-all-3.7.0/arthas-bin.zip
unzip arthas-bin.zip
sh install-local.sh
apline镜像无法attach 1号进程
[ERROR] Start arthas failed, exception stack trace:
com.sun.tools.attach.AttachNotSupportedException: Unable to get pid of LinuxThreads manager thread
# 执行以下命令修复
pid=1 ;\
touch /proc/${pid}/cwd/.attach_pid${pid} && \
kill -SIGQUIT ${pid} && \
sleep 2
curl
curl查看请求响应时间
curl -o /dev/null -s -w %{http_code}---%{content_type}---%{time_namelookup}---%{time_namelookup}---%{time_connect}---%{time_starttransfer}---%{time_total}---%{speed_download}"\n" "http://www.baidu.com/"
-o /dev/null:把curl 返回的html、js 写到垃圾回收站[ /dev/null]
-s:去掉所有状态
-w:按照后面的格式写出rt
http_code http状态码:
content_type: 类型
time_namelookup:DNS 解析域名www.36nu.com的时间
time_commect:client和server端建立TCP 连接的时间
time_starttransfer:从client发出请求;到web的server 响应第一个字节的时间
time_total:client发出请求;到web的server发送会所有的相应数据的时间
speed_download:下载速度 单位 byte/s
iperf
iperf命令是一个网络性能测试工具,可以测试TCP和UDP带宽质量。同时也可以通过UDP测试报告网丢包率或者发包性能。 参考: https://cloud.tencent.com/developer/article/1688469
iperf安装:
可以直接通过官网下载对应系统版本进行安装(https://iperf.fr/iperf-download.php) 1.对于windows版的iPerf,直接将解压出来的iperf.exe和cygwin1.dll复制到%systemroot%目录即可 2.对于linux版的iPerf,请使用如下命令安装 rpm -ivh iperf-.rpm
常用参数指南(详见附录):
-c/s:客户端模式/服务端模式
-p:指定iperf测试端口
-i:指定报告间隔
-b:设置UDP的发送带宽,单位bit/s
-t:设置测试的时长,单位为秒,不设置默认10s
-l:指定包大小,TCP默认8k,UDP默认1470字节
带宽性能测试: 1、针对TCP进行带宽性能测试 服务端命令:iperf -s -i 1 -p 3389 客户端命令:iperf -c 172.19.16.97 -p 3389 -i 1
2、针对UDP进行带宽性能测试
带宽性能压测通常采用udp模式,因为能测出极限带宽、时延抖动、丢包率。在进行测试时,首先以链路理论带宽作为数据发送速率进行测试,例如,从客户端到服务器之间的链路的理论带宽为100Mbps,先用-b 100M进行测试,然后根据测试结果(包括实际带宽,时延抖动和丢包率),再以实际带宽作为数据发送速率进行测试,会发现时延抖动和丢包率比第一次好很多,重复测试几次,就能得出稳定的实际带宽。
本次测试机器为腾讯云标准网络优化型实例(S2ne.LARGE8),内网带宽性能可以支撑1.5Gbps;
服务端命令
iperf -u -s -i 1 -p 3389
客户端命令
1、iperf -u -c 172.19.16.97 -p 3389 -b 1500M -i 1
2、iperf -u -c 172.19.16.97 -p 3389 -b 2000M -i 1
测试可以看出,在测试带宽到达官网保证的1.5Gbps的时候,网络性能良好,是没有出现丢包的,当带宽跑到2Gbps的时候,会发现由于带宽超限,已经出现明显的丢包现象。
网络收发包性能测试:
通过UDP发包测试不仅可以通过-b xxxM的形式测试实例的带宽性能情况,还可以通过-b xxxpps测试实例的收发包性能,这里还是选用腾讯云标准网络优化型实例(S2ne.LARGE8),官网承诺收发包量为30Wpps进行测试。
需要注意的是,网络收发包量的测试同时还会受到缓冲区大小的影响,默认的缓冲区比较小的话,会造成实例到达高pps丢包的现象,这里建议在测试前调整下缓冲区大小;同时由于UDP默认发包大小为1470字节,在发包量很高的情况会超出实例的带宽限制,所以这里需-l 指定发包大小,本次测试采用-l 100bit。
1、调整UDP缓冲区大小
vi /etc/sysctl.conf
添加
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
# 执行sysctl -p 使得参数生效(不重启刷新参数)
# 查看参数是否生效
sysctl -a|egrep "wmem|rmem"
2、进行测试
服务端命令 iperf -u -s -i 1 -p 3389
客户端命令
iperf -u -c 172.19.16.97 -b 300000pps -l 100bit -i 1 -p 3389
iperf -u -c 172.19.16.97 -b 320000pps -l 100bit -i 1 -p 3389
通过测试可以发现,实例在官网承诺的30Wpps进行收发包测试的时候是没有丢包现象的,当测试收发包到达32Wpps的时候已经开始出现丢包现象了,所以这里建议在选用实例的过程中,尽量根据业务的实际情况选择,尽量避免实例在瓶颈期使用。
附录:iperf常用选项
tcping
常规我们多数使用 ping 命令来检查网络延时, ping 命令是基于ICMP的请求应答报文来测量网络延时情况。ICMP处在网络层协议层, 某些场景下, ICMP 容易被防火墙阻止, 这样场景下 ping 工具就无法使用了。这种场景下, 需要使用TCP/UDP协议来测试三层网络的延时状态。
我们可以使用 tcpping 来进行网络延迟的测量, tcpping 是使用TCP协议的三次握手利用半开连接技术实现.比如想远端的80端口建立连接, 会先发送一个 TCP SYN 包, 如果远端的80端口正常, 将回复 TCP ACK 包, 否则将响应 TCP RST 包。因此 tcpping 可以定时通过 发送 SYN 包, 接收 ACK 或 RST包来计算到远程主机的访问延时(RTT)。 tcptraceroute 软件已经实现了半开连接技术,tcpping依赖该软件来实现网络延迟的测量。
安装依赖: tcpping 是一个 shell 脚本, 依赖tcptraceroute 、 bc 软件包
debian:
apt -y install tcptraceroute bc
centos:
yum -y install tcptraceroute bc
tcping脚本
# wget -O tcping https://soft.mengclaw.com/Bash/TCP-PING
vim tcping
#!/bin/sh
#
# tcpping: test response times using TCP SYN packets
# URL: http://www.vdberg.org/~richard/tcpping.html
#
# uses tcptraceroute from http://michael.toren.net/code/tcptraceroute/
#
# (c) 2002-2005 Richard van den Berg <richard@vdberg.org> under the GPL
# http://www.gnu.org/copyleft/gpl.html
#
# 2002/12/20 v1.0 initial version
# 2003/01/25 v1.1 added -c and -r options
# now accepting all other tcptraceroute options
# 2003/01/30 v1.2 removed double quotes around backquotes
# 2003/03/25 v1.3 added -x option, courtesy of Alvin Austin <alvin@crlogic.com>
# 2005/03/31 v1.4 added -C option, courtesy of Norman Rasmussen <norman@rasmussen.org>
# 2007/01/11 v1.5 catch bad destination addresses
# 2007/01/19 v1.6 catch non-root tcptraceroute
# 2008/02/10 v1.7 make -C work when reverse lookup fails, courtesy of Fabrice Le Dorze <Fabrice.LeDorze@apx.fr>
ver="v1.7"
format="%Y%m%d%H%M%S"
d="no"
c="no"
C="no"
ttl=255
seq=0
q=1
r=1
w=3
topts=""
usage () {
name=`basename $0`
echo "tcpping $ver Richard van den Berg <richard@vdberg.org>"
echo
echo "Usage: $name [-d] [-c] [-C] [-w sec] [-q num] [-x count] ipaddress [port]"
echo
echo " -d print timestamp before every result"
echo " -c print a columned result line"
echo " -C print in the same format as fping's -C option"
echo " -w wait time in seconds (defaults to 3)"
echo " -r repeat every n seconds (defaults to 1)"
echo " -x repeat n times (defaults to unlimited)"
echo
echo "See also: man tcptraceroute"
echo
}
_checksite() {
ttr=`tcptraceroute -f ${ttl} -m ${ttl} -q ${q} -w ${w} $* 2>&1`
if echo "${ttr}" | egrep -i "(bad destination|got roo)" >/dev/null 2>&1; then
echo "${ttr}"
exit
fi
}
_testsite() {
myseq="${1}"
shift
[ "${c}" = "yes" ] && nows=`date +${format}`
[ "${d}" = "yes" ] && nowd=`date`
ttr=`tcptraceroute -f ${ttl} -m ${ttl} -q ${q} -w ${w} $* 2>/dev/null`
host=`echo "${ttr}" | awk '{print $2 " " $3}'`
rtt=`echo "${ttr}" | sed 's/.*] //' | awk '{print $1}'`
not=`echo "${rtt}" | tr -d ".0123456789"`
[ "${d}" = "yes" ] && echo "$nowd"
if [ "${c}" = "yes" ]; then
if [ "x${rtt}" != "x" -a "x${not}" = "x" ]; then
echo "$myseq $nows $rtt $host"
else
echo "$myseq $nows $max $host"
fi
elif [ "${C}" = "yes" ]; then
if [ "$myseq" = "0" ]; then
echo -n "$1 :"
fi
if [ "x${rtt}" != "x" -a "x${not}" = "x" ]; then
echo -n " $rtt"
else
echo -n " -"
fi
if [ "$x" = "1" ]; then
echo
fi
else
echo "${ttr}" | sed -e "s/^.*\*.*$/seq $myseq: no response (timeout)/" -e "s/^$ttl /seq $myseq: tcp response from/"
fi
# echo "${ttr}"
}
while getopts dhq:w:cr:nNFSAEi:f:l:m:p:s:x:C opt ; do
case "$opt" in
d|c|C) eval $opt="yes" ;;
q|w|r|x) eval $opt="$OPTARG" ;;
n|N|F|S|A|E) topt="$topt -$opt" ;;
i|l|p|s) topt="$topt -$opt $OPTARG" ;;
f|m) ttl="$OPTARG" ;;
?) usage; exit ;;
esac
done
shift `expr $OPTIND - 1`
if [ "x$1" = "x" ]; then
usage
exit
fi
max=`echo "${w} * 1000" | bc`
if [ `date +%s` != "%s" ]; then
format="%s"
fi
_checksite ${topt} $*
if [ "$x" = "" ]; then
while [ 1 ] ; do
_testsite ${seq} ${topt} $* &
pid=$!
if [ "${C}" = "yes" ]; then
wait $pid
fi
seq=`expr $seq + 1`
sleep ${r}
done
else
while [ "$x" -gt 0 ] ; do
_testsite ${seq} ${topt} $* &
pid=$!
if [ "${C}" = "yes" ]; then
wait $pid
fi
seq=`expr $seq + 1`
x=`expr $x - 1`
if [ "$x" -gt 0 ]; then
sleep ${r}
fi
done
fi
exit
https证书更新
查看过期时间:
curl --insecure -v -s -o /dev/null https://jingy-dev-h5.ccreate.site 2>&1 | grep "expire date"
curl --insecure -v -s -o /dev/null https://jingy-dev-api.ccreate.site 2>&1 | grep "expire date"
curl --insecure -v -s -o /dev/null https://jingy-dev-web.ccreate.site 2>&1 | grep "expire date"
更新证书:
docker run --rm -it \
-v /letsencrypt/certbot/etc/letsencrypt:/etc/letsencrypt \
-v /letsencrypt/certbot/var/log/letsencrypt:/var/log/letsencrypt \
-v /usr/share/nginx/token-api/:/data/letsencrypt certbot/certbot \
certonly --webroot --email cc98760@qq.com --agree-tos --no-eff-email \
--webroot-path=/data/letsencrypt -d app-dev-api.test.site
docker run --rm -it -v /letsencrypt/certbot/etc/letsencrypt:/etc/letsencrypt \
-v /letsencrypt/certbot/var/log/letsencrypt:/var/log/letsencrypt \
-v /usr/share/nginx/token:/data/letsencrypt certbot/certbot \
certonly --webroot --email cc98760@qq.com --agree-tos --no-eff-email \
--webroot-path=/data/letsencrypt -d app-dev-web.test.site
docker run --rm -it -v /letsencrypt/certbot/etc/letsencrypt:/etc/letsencrypt \
-v /letsencrypt/certbot/var/log/letsencrypt:/var/log/letsencrypt \
-v /usr/share/nginx/token-h5/:/data/letsencrypt certbot/certbot \
certonly --webroot --email cc98760@qq.com --agree-tos --no-eff-email \
--webroot-path=/data/letsencrypt -d abc-dev-h5.test.site
find
查找空目录:
find /path/to/search -type d -empty
查找修改时间大于10天的文件并删除:
find /path/to/directory -type f -mtime +10 -delete
useradd
创建一个不可以登陆、没有家目录的用户:
useradd -M -s /sbin/nologin user
zip、unzip
zip压缩文件:
zip -r nacos_config_export_202304271606-zgstreet-default.zip base system
选项 说明 -q 不显示指令执行过程 -r 递归处理,将指定目录下的所有文件和子目录一起处理 -z 给压缩文件加上注释 -v 显示指令的执行过程 -d 删除压缩包内的文件 -n <后缀> 不压缩具有特定后缀的文件 -e 加密压缩文件 -u 更新或追加文件到压缩包内 -f 更新现有的文件 -m 将文件压缩并加入压缩文件后,删除原始文件,即把文件移到压缩文件中 -o 以压缩文件内拥有最新更改时间的文件为准,将压缩文件的更改时间设成和该文件相同
unzip解压缩:
# 查看压缩包内的文件
unzip -l test.zip
windows cmd命令
进程
# 查看进程:
tasklist.exe |findstr Sang
# kill进程
taskkill.exe /F /PID 56104
网络调试相关命令
#文件句柄数统计: 进程句柄被打满将导致客户端请求响应connection reset by peer。
find /proc/*/fd -type l | awk -F/ '{print $3}' | sort | uniq -c | sort -nr|head -20
ls /proc/$pid/fd/ | wc -l
#查看系统限制:
ulimit -a
#
sysctl -w net.core.somaxconn=4096
CLOSE_WAIT状态链接太多,可能会占用大量句柄,从CLOSE_WAIT状态入手分析。结合TCP状态机,四次挥手过程中,被动关闭的一方收到第一次断开链接的FIN包后进入CLOSE_WAIT状态,等待发送完数据,然后发出第二次FIN包后进入LAST_ACK状态,收到对端ACK后进入CLOSED状态完成,另外CLOSE_WAIT状态有超时时间(一般默认是2H),超时会被系统关闭。三次握手是在系统内核完成的,但是四次挥手由于要等待数据发送完成,是和应用程序相关的,内核收到第一个FIN后会通知应用程序,应该是应用程序要响应后才能再发送第二个FIN。
结合这些信息猜测:服务句柄是被逐渐累积打满的,出现大量CLOSE_WAIT是由于客户端先断开链接(很可能是请求超时),服务端在收到客户端超时端口请求后,由于用户态请求处理阻塞,导致第二次FIN无法发送,而且应该是出现了死锁等问题,持久阻塞(句柄一致没有被释放)。客户端应该是先有大量io timeout,等服务端句柄被打满后才出现connect reset by peer的,而客户端io timeout增多很可能是服务端处理请求耗时突增或者阻塞导致。
ubuntu
ubunut查看指定安装包版本
1.
apt-cache madison <<package name>>
2.
apt-cache policy <<package name>>
3.
apt-cache showpkg <<package name>>
4.
apt-get install -s <<package-name>>
说明:这个命令只是模拟安装时会安装哪些软件列表,但不会例举出每个软件有多少个版本
systemctl删除服务
systemd管理的unit也就是后缀是service的文件存放的路径为:/etc/systemd/system/或者/usr/lib/systemd/system/。
首先查看已有服务:
systemctl list-units
查看没有被激活的服务
systemctl list-unit-files
当服务也就是service文件修改后要重新载入,这个载入是重载所有文件,不是单独的一个service文件
systemctl daemon-reload
这里切记后面不要加service文件的名称,我输入多次报错 “Too many arguments.”,以为是service里面写的命令参数带多了,实际是这个reload命令后面带了不应该带的参数。
即使我们reload,Systemd已然可以使用自己缓存的服务文件,哪怕你用了daemon-reload更新。所以这时候要告诉Systemd,我们已经放弃不存在的服务文件了,让它也放弃自己缓存的那份:
systemctl reset-failed
uos
修改IP
查看网卡信息:
root@uos01:~# nmcli c show
NAME UUID TYPE DEVICE
Wired connection 1 f129f55b-c8e3-35fd-98ff-5ca047b65dfc ethernet ens32
root@uos01:~# nmcli c show f129f55b-c8e3-35fd-98ff-5ca047b65dfc
connection.id: Wired connection 1
connection.uuid: f129f55b-c8e3-35fd-98ff-5ca047b65dfc
...
ipv4.method: manual
ipv4.dns: 192.168.157.2
ipv4.addresses: 192.168.157.200/24
ipv4.gateway: 192.168.157.2
...
ipv6.addresses: --
ipv6.gateway: --
...
GENERAL.NAME: Wired connection 1
GENERAL.UUID: f129f55b-c8e3-35fd-98ff-5ca047b65dfc
GENERAL.DEVICES: ens32
GENERAL.STATE: activated
...
IP4.ADDRESS[1]: 192.168.157.200/24
IP4.GATEWAY: 192.168.157.2
...
修改网络参数重启网卡
nmcli connection modify f129f55b-c8e3-35fd-98ff-5ca047b65dfc ipv4.method manual ipv4.addresses 192.168.157.200/24 ipv4.gateway 192.168.157.2 ipv4.dns 192.168.157.2
nmcli connection down f129f55b-c8e3-35fd-98ff-5ca047b65dfc && nmcli connection up f129f55b-c8e3-35fd-98ff-5ca047b65dfc
rename批量修改文件名
# touch abc.txt abc.yaml abc.json
# ls
abc.json abc.txt abc.yaml
# rename abc cfg abc.*
# ls
cfg.json cfg.txt cfg.yaml
评论区