做爲高級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,歡迎添加好友,​進一步交流。​

相關文章
相關標籤/搜索