ziggle

Hail Hydra


  • Home

  • Archives

  • Search

linux-故障排查

Posted on 2019-06-27

找到占用CPU最高的线程

  • 通常的做法是:
    ➊ 在命令行输入top,然后shift+p查看占用CPU最高的进程,记下进程号
    ➋ 在命令行输入top -Hp 进程号,查看占用CPU最高的线程
    ➌ 使用printf 0x%x 线程号,得到其16进制线程号
    ➍ 使用jstack 进程号得到java执行栈,然后grep16进制找到相应的信息
  • 这一行Shell的意思是,找到使用CPU最高的进程之使用CPU最高的线程的16进制号。
1
ps -eo %cpu,pid |sort -n -k1 -r | head -n 1 |  awk '{print $2}' |xargs  top -b -n1 -Hp | grep COMMAND -A1 | tail -n 1 | awk '{print $1}' | xargs printf 0x%x

先记住这些判断准则,我们在示例中再聊:
➊ 如果load超过了cpu核数,则负载过高
➋ 如果wa过高,可初步判断I/O有问题
➌ sy,si,hi,st,任何一个超过5%,都有问题
➍ 进程状态长时处于D、Z、T状态,提高注意度
➎ cpu不均衡,判断亲和性和优先级问题

CPU过高是表象。除了系统确实负载已经到了极限,其他的,都是由其他原因引起的,比如I/O;比如设备。这些我们放在其他章节进行讨论。

GC引起的CPU过高

接着我们最开始的例子来。通过查看jstack找到相应的16进制进程,结果发现是GC线程。

“VM Thread” prio=10 tid=0x00007f06d8089000 nid=0x58c7 runnable

“GC task thread#0 (ParallelGC)” prio=10 tid=0x00007f06d801b800 nid=0x58d7 runnable
这种情况,一般都是JVM内存不够用了,疯狂GC,可能是socket/线程忘了关闭了,也可能是大对象没有回收。这种情况只能通过重启来解决了,记得重启之前,使用jmap dump一下堆栈哦。当然,你可能会得到jdk版本的问题。

st%占比过高
st过高一般是物理CPU资源不足所致,也就是只发生在虚拟机上。
如果你买的虚拟机st一直很高,那你的服务提供商可能在超卖,挤占你的资源。不信双11的时候看下你的虚拟机?

网卡导致单cpu过高

业务方几台kafka,cpu使用处于正常水平,才10%左右,但有一核cpu,负载特别的高,si奇高。

mpstat -I SUM -P ALL 查看cpu使用情况,cpu0的中断确实比较多。

20:15:18 CPU intr/s
20:15:23 all 34234.20
20:15:23 0 9566.20
20:15:23 1 0.00
网卡需要cpu服务时,都会抛出一个中断,中断告诉cpu发生了什么事情,cpu就要停止目前的工作来处理这个中断。其实,默认所有的中断处理都集中在cpu0 上,导致服务器负载过高。cpu0 成了瓶颈,而其他cpu却还闲着。
➊ 解决方式1:使用CPU亲和性功能,kafka略过网卡所使用的CPU
➋ 解决方式2: 更换网卡
➌ 通常修改的方式还是有些复杂了,比如,修改

/proc/irq/{seq}/smp_affinity

我们可以直接安装irqbalance,然后执行就可以了。

yum install irqbalance -y
service irqbalance start
cpu使用率低,但负载高
cpu id%高,也就是空闲,比如90%。但 load average非常高,比如4核达到10。

分析:load average高,说明其任务已经排队,许多任务正在等待。出现此种情况,可能存在大量不可中断的进程。

使用top或者ps可以看到进程相应的状态。

https://mp.weixin.qq.com/s/WTva_bvkIn7uTCxv0m2RiA

which woman love man

排查内存的一些命令

内存分两部分,物理内存和swap。物理内存问题主要是内存泄漏,而swap的问题主要是用了swap~,我们先上一点命令。

物理内存

  • 根据使用量排序查看RES
    top -> shift + m
  • 查看进程使用的物理内存
    ps -p 75 -o rss,vsz
  • 显示内存的使用情况
    free -h
  • 使用sar查看内存信息
    sar -r
  • 显示内存每个区的详情
    cat /proc/meminfo
  • 查看slab区使用情况
    slabtop
    通常,通过查看物理内存的占用,你发现不了多少问题,顶多发现那个进程占用内存高(比如vim等旁路应用)。meminfo和slabtop对系统的全局判断帮助很大,但掌握这两点坡度陡峭。

swap

  • 查看si,so是否异常
    vmstat 1
  • 使用sar查看swap
    sar -W
  • 禁用swap
    swapoff
  • 查询swap优先级
    sysctl -q vm.swappiness
  • 设置swap优先级
    sysctl vm.swappiness=10
    建议关注非0 swap的所有问题,即使你用了ssd。swap用的多,通常伴随着I/O升高,服务卡顿。swap一点都不好玩,不信搜一下《swap罪与罚》这篇文章看下,千万不要更晕哦。
Read more »

docker-apps

Posted on 2019-06-26

docker 安装 nuxus

1
2
$ mkdir -p /lib/nexus/nexus-data && chown -R 200 /lib/nexus/nexus-data
$ docker run -d -p 8081:8081 --name nexus -v /lib/nexus/nexus-data:/nexus-data sonatype/nexus3

docker-mysql

  • step1
    docker pull mysql/mysql-server:latest
  • step2
    docker run –name foo-mysql -e MYSQL_ROOT_PASSWORD=passwd -e MYSQL_ROOT_HOST=% -v /etc/mysql/my.conf:/etc/mysql/my.conf -p 3306:3306 -d mysql:latest

  • step3

    1
    2
    docker exec -it foo-mysql mysql -u root -p 
    ALTER USER 'root'@'localhost' IDENTIFIED BY '<password>';

docker rabbitmq

1
docker run -d --hostname some-rabbit --name some-rabbit --network some-network -e RABBITMQ_ERLANG_COOKIE='123456' rabbitmq:3

linux-tcp

Posted on 2019-06-25

linux tcp 调优

端口范围

  • 0-1024 端口受保护
  • 当前主机可以使用的端口范围
    1
    2
    [root@localhost logstash]# cat  /proc/sys/net/ipv4/ip_local_port_range 
    32768 60999

大量并发请求时 大量请求等待建立连接 如果TIME_WAIT 很多的话

  • 设置更小的timeout 快速释放请求
    1
    2
    [root@localhost logstash]# cat  /proc/sys/net/ipv4/tcp_fin_timeout 
    60

设置time_wait连接重用

1
echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse

设置time_wait 快速回收

1
echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle

以上设置都是临时性的

1
2
3
cat /proc/net/netstat  # tcp 统计信息
cat /proc/net/snmp # 系统连接情况
netstat -s # 网络统计信息

linux net 相关

  • netstat属于net-tools工具集,而ss属于iproute。其命令对应如下,是时候和net-tools说Bye了。

用途 net-tools iproute
统计 ifconfig ss
地址 netstat ip addr
路由 route ip route
邻居 arp ip neigh
VPN iptunnel ip tunnel
VLAN vconfig ip link
组播 ipmaddr ip maddr

  • 查看系统正在监听的tcp连接

ss -atr
ss -atn #仅ip

  • 查看系统中所有连接

ss -alt

  • 查看监听444端口的进程pid

ss -ltp | grep 444

  • 查看进程555占用了哪些端口

ss -ltp | grep 555

  • 显示所有udp连接

ss -u -a
查看TCP sockets,使用-ta选项
查看UDP sockets,使用-ua选项
查看RAW sockets,使用-wa选项
查看UNIX sockets,使用-xa选项

  • 显示所有的http连接
    ss dport = :http

  • 查看连接本机最多的前10个ip地址
    netstat -antp | awk ‘{print $4}’ | cut -d ‘:’ -f1 | sort | uniq -c | sort -n -k1 -r | head -n 10

  • sysctl命令可以设置这些参数,如果想要重启生效的话,加入/etc/sysctl.conf文件中。
1
2
3
4
5
6
7
8
# 修改阈值
net.ipv4.tcp_max_tw_buckets = 50000
# 表示开启TCP连接中TIME-WAIT sockets的快速回收
net.ipv4.tcp_tw_reuse = 1
#启用timewait 快速回收。这个一定要开启,默认是关闭的。
net.ipv4.tcp_tw_recycle= 1
# 修改系統默认的TIMEOUT时间,默认是60s
net.ipv4.tcp_fin_timeout = 10
Read more »

java-stream

Posted on 2019-06-19

Java Stream

https://github.com/CarpenterLee/JavaLambdaInternals

Java 8

https://github.com/winterbe/java8-tutorial

cargo

Posted on 2019-05-27

Cargo 代理配置

conf

1
2
3
4
5
[source.crates-io]
registry = "https://github.com/rust-lang/crates.io-index"
replace-with = 'ustc'
[source.ustc]
registry = "git://mirrors.ustc.edu.cn/crates.io-index"

1…101112…22
ziggle

ziggle

Hail Hydra !

110 posts
45 tags
RSS
GitHub
© 2021 ziggle
Powered by Hexo
|
Hail Hydra—