做为高级Java,你应该了解的Linux知识

原创:小姐姐味道(微信公众号ID:xjjdog),欢迎分享,转载请保留出处。

做为一个javaer,我之前写过不少关于Linux的文章。但通过多年的观察,发现其实对于大部分人,有些东西压根就用不着。用的最多的,就是到线上排查个问题而已,这让人非常苦恼。那么,咱们就将范围再缩小一下。java

最有用系列:linux

《 Linux上,最经常使用的一批命令解析(10年精选)》程序员

《Linux生产环境上,最经常使用的一套“vim“技巧》面试

《Linux生产环境上,最经常使用的一套“Sed“技巧》shell

《Linux生产环境上,最经常使用的一套“AWK“技巧》apache

《"Sed" 高级功能:我这小脑瓜都快绕晕了》vim

Linux命令好像还真很多,根本缘由就是软件多,也有像ag这样的命令想替代grep,但大多数命令古老而坚挺。不是由于这些软件设计的有多好,缘由是一些软件最开始入驻了系统,时间久了,就变成了一种约定,这种习惯改变代价太大,就像把全部键盘的LF换一下同样。缓存

这片文章假定你已经了解大多数Linux命令,并了解操做系统的基本元素。若是你如今了解的命令还不足10个,下面的内容就不用看了。除了最基本的东西,本文列出一些对你的面试最多见的最能加分的地方,有些组合多是你没见过的技巧。但本文仅仅是给出一个大体的轮廓和印象,为之后的专题性考察点做一个序。bash

本文中出现的全部命令,应该熟记并熟练使用。服务器

几种比较典型的Linux系统

首先对目前的Linux版本有个大致的印象,大致分Desktop版和Server版,已是百花齐放。

  • Ubuntu 最多见的Linux我的发行版,一位有情怀的南非富豪,有了钱你也能够这么作
  • CentOS 最经常使用Linux服务器发新版,RHEL的开放版本,因版权而生的轮子
  • Arch 滚动升级,海量二进制包,社区活跃,我的最爱
  • Gentoo 安装软件须要从源码开始编译,稳定,但用起来会很痛
  • LFS 从零构建Linux,跟着作一遍,Linux每根毛都看的清清楚楚
  • Kali 专作渗透用的,表明了发行版的一个发展路径,就是领域

首先要了解的概念

  • KISS Keep it Simple and Stupid,听说是哲学
  • 一切皆文件 一般是文件的东西叫文件,进程、磁盘等也被抽象成了文件,比较离谱的管道、设备、socket等,也是文件。这是Linux最重要的组织方式。
  • 管道 | 分隔,前面命令的输出做为后面命令的输入,能够串联多个
  • 重定向

    • < 将文件作为命令的输入
    • > 将命令的输出输出到文件
    • >> 将命令的输出追加到文件
  • SHELL 首先确认你的shell,通常最经常使用的是bash,也有很多用csh,zsh等的,经过echo $SHELL能够看到当前用户的shell,对应的配置文件也要相应改变。好比.zshrc,.bashrc

四大元素

进入linux,咱们首先关注的是四个元素:内存,cpu,存储,网络。Linux提供了足够的命令,让你窥探它的每一个角落。接下来的命令都是些最经常使用的,无论精通不精通,想不起来要打屁股。

CPU

  • 使用top查看cpu的load,使用shift+p按照cpu排序。须要了解wa,us等都是什么意思
  • 使用uptime查看系统启动时间和load,load是什么意思呢?什么算是系统过载?这是个高频问题,别怪我没告诉你
  • ps命令勃大茎深,除了查进程号外,你还须要知道R、S、D、T、Z、<、N状态位的含义
  • topps不少功能是相通的,好比watch "ps -mo %cpu,%mem,pid,ppid,command ax" 至关于top的进程列表;top -n 1 -bcps -ef的结果类似。
  • 有生就有死,能够用kill杀死进程。对java来讲,须要关注kill -9kill -15kill -3的含义,kill的信号太多了,能够用kill -l查看,搞懂大多数信号大有裨益。
  • 若是暂时不想死,能够经过&符号在后台执行,好比tail -f a.log &jobs命令能够查看当先后台的列表,想恢复的话,使用fg回到幕前。这都是终端做业,当你把term关了你的后台命令也会跟着消失,因此想让你的程序继续执行的话,须要nohup命令,此命令须要牢记
  • mpstat 显示了系统中 CPU 的各类统计信
  • 了解cpu亲和性

内存

  • free -m 命令,了解free、used、cached、swap各项的含义
  • cat /proc/meminfo 查看更详细的内存信息
    细心的同窗可能注意到,CPU和内存的信息,经过top等不一样的命令显示的数值是同样的。
  • slabtop 用来显示内核缓存占用状况,好比遍历大量文件形成缓存目录项。曾在生产环境中遇到因执行find /形成dentry_cache耗尽服务器内存。
  • vmstat 命令是我最喜欢也最经常使用的命令之一,能够以最快的速度了解系统的运行情况。每一个参数的意义都要搞懂。
  • swapon、swapoff 开启,关闭交换空间
  • sar 又一统计类轮子,通常用做采样工具

存储

  • 使用df -h查看系统磁盘使用概况
  • lsblk 列出块设备信息
  • du 查看目录或者文件大小

网络

  • rsync 强大的同步工具,能够增量哦
  • netstat 查看Linux中网络系统状态信息,各类
  • ss 它可以显示更多更详细的有关TCP和链接状态的信息,并且比netstat更快速更高效。
  • curl、wget 模拟请求工具、下载工具。如wget -r http://site 将下载整个站点
  • ab Apache服务器的性能测试工具
  • ifstat 统计网络接口流量状态
  • nslookup 查询域名DNS信息的工具,在内网根据ip查询域名是爽爆了
  • nc 网络工具中的瑞士军刀,不会用真是太惋惜了
  • arp 能够显示和修改IP到MAC转换表
  • traceroute 显示数据包到主机间的路径,俗称几跳,跳的越少越快
  • tcpdump 很少说了,去下载wireshark了
  • wall 向当前全部打开的终端上输出信息。使用who命令发现女神正在终端上,能够求爱

网络方面推荐安装体验一下kaliLinux,上面的工具会让你high到极点。

如何组织起来

linux的命令颇有意思,除了各类stat来监控状态,也有各类trace来进行深刻的跟踪,也有各类top来统计资源消耗者,也有各类ls来查看系统硬件如lsblk、lsusb、lscpi。基本上跟着你的感受走,就能找到相应的工具,由于约定是系统中最强大的导向。

Linux有个比较另类的目录/proc,承载了每一个命令的蹂躏。像sysctl命令,就是修改的/proc/sys目录下的映射项。不信看看find /proc/sys -type f | wc -lsysctl -a| wc -l的结果是否是很像?

/proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间。只不过以文件系统的方式为访问系统内核数据的操做提供接口。系统的全部状态都逃不过它的火眼金睛。例如:

  • cat /proc/vmstat 看一下,是否是和vmstat命令的输出很像?
  • cat /proc/meminfo 是否是最全的内存信息
  • cat /proc/slabinfo 这不就是slabtop的信息么
  • cat /proc/devices 已经加载对设备们
  • cat /proc/loadavg load avg原来就躺在这里啊
  • cat /proc/stat 全部的CPU活动信息
  • ls /proc/$pid/fd 静静地躺着lsof的结果

通常排查问题的方法

通常排查问题也是围绕着内存cpu等几个元素去排查。下图是一张大致的排查故障或者性能问题的过程,看图,很少说。

应用场景举例

下面举例从具体应用场景来讲明各类命令的组合应用,此类场景数不胜数,须要我的积累。但强烈建议将sed和awk练的熟练一些。

怎么查看某个Java进程里面占用CPU最高的一个线程具体信息?

  • 获取进程中占用CPU最高的线程,计为n。

    • 使用top top -H -p pid,肉眼观察之
    • 使用ps ps -mo spid,lwp,stime,time,%cpu -p pid
  • 将线程号转化成十六进制printf 0x%x n
  • 使用jstack找到相应进程,打印线程后的100行信息 jstack -l pid| grep spid -A 100

统计每种网络状态的数量

netstat -ant | awk '{print $6}' | sort | uniq -c | sort -n -k 1 -r
首先使用netstat查看列表,使用'awk'截取第六列,使用uniq进行统计,并对统计结果排序。固然,也能够这样。
netstat -ant | awk '{arr[$6]++}END{for(i in arr){print arr[i]" "i }}' | sort -n -k 1 -r
这和“分析apache日志,给出当日访问ip的降序列表”是同样的问题。

怎么查看哪一个进程在用swap

首先要了解/proc/$pid/smaps里有咱们所须要的各类信息,其中Swap字段便是咱们所须要的。只要循环遍历一下便可。

for i in `cd /proc;ls |grep "^[0-9]"|awk ' $0 >100'` ;do awk '/Swap:/{a=a+$2}END{print '"$i"',a/1024"M"}' /proc/$i/smaps ;done |sort -k2nr

最后,附上http://www.brendangregg.com/ 的大图一张

End

软件领域有两种人才,一种是工程型的,一种是研究型的。在Linux领域里,相对于搞内核研究的来讲,搞命令行的就属于工程型。工程型也有他本身的苦衷,好比,背诵命令就挺痛苦的,通常来讲不太推荐背诵,第一覆盖的面不广,第二记的快忘的也快,浪费脑细胞。牛逼的记法就是用,用时间来冲淡烟云,见微知著,并体验其中的喜悦。爱她并每天抱她上床,真爱才成。

做者简介: 小姐姐味道 (xjjdog),一个不容许程序员走弯路的公众号。聚焦基础架构和Linux。十年架构,日百亿流量,与你探讨高并发世界,给你不同的味道。个人我的微信xjjdog0,欢迎添加好友,​进一步交流。​

相关文章
相关标签/搜索