處理問(wèn)題時(shí)必定不能盲狙,將所有解決辦法都試上一遍。這生產(chǎn)環(huán)境中,解決出現(xiàn)的問(wèn)題是最優(yōu)先的事情,當(dāng)然前提是這問(wèn)題會(huì)影響用戶的使用或即將影響到的。
站在用戶的角度思考問(wèn)題,與客戶深入溝通,找到修水網(wǎng)站設(shè)計(jì)與修水網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:成都做網(wǎng)站、成都網(wǎng)站建設(shè)、成都外貿(mào)網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、域名注冊(cè)、網(wǎng)站空間、企業(yè)郵箱。業(yè)務(wù)覆蓋修水地區(qū)。
處理每個(gè)問(wèn)題必然可按具體問(wèn)題進(jìn)行分類,根據(jù)每一類按對(duì)應(yīng)的解決思路來(lái)執(zhí)行。
但像處理一個(gè)網(wǎng)絡(luò)問(wèn)題的時(shí)候,上至系統(tǒng)防火墻的配置、下至硬件故障。如果處理一個(gè)問(wèn)題都按固定流程來(lái)進(jìn)行的話,那必然效率將非常低下。下為處理網(wǎng)絡(luò)故障的一般流程。
1、網(wǎng)絡(luò)硬件問(wèn)題檢查。???????????????????? (機(jī)率較低)
2、檢查網(wǎng)卡能否正常工作。??????????? (較高、主要表現(xiàn)為人為配置錯(cuò)誤)
3、檢查局域網(wǎng)之間聯(lián)機(jī)是否正常。(非常高)
4、檢查DNS是否設(shè)定正確。??????????? (較低)
5、服務(wù)是否正常打開。???????????????????? (低)
6、檢查訪問(wèn)權(quán)限是否打開。??????????? (較高)
假如從1至6是標(biāo)準(zhǔn)的處理網(wǎng)絡(luò)問(wèn)題的流程,這樣的處理方式效率低下。處理問(wèn)題可以有整體的流程,但是實(shí)際操作中可先對(duì)出現(xiàn)機(jī)率更高的步驟進(jìn)行檢查、或采取2分法縮小產(chǎn)生問(wèn)題的范圍,雖然上述較的兩個(gè)方法不一定對(duì)所有問(wèn)題都試用,但對(duì)于大多數(shù)的網(wǎng)絡(luò)問(wèn)題來(lái)說(shuō)處理效率有者顯著的提升。
個(gè)人總結(jié)的情況如下。
1、lsmod | grep ip??????????? 查看相關(guān)的網(wǎng)卡模塊是否已加載
2、ifconfig -a??????????????????? 能使用該命令查找到對(duì)應(yīng)網(wǎng)卡配置信息,則說(shuō)明網(wǎng)卡驅(qū)動(dòng)程序正常
3、使用ping命令、依次ping自己、ping局域網(wǎng)主機(jī)、ping網(wǎng)關(guān)
ping自己異常,問(wèn)題:服務(wù)異常、網(wǎng)卡配置未生效
ping局域網(wǎng)主機(jī)異常,問(wèn)題:配置文件有誤、網(wǎng)卡配置未生效、網(wǎng)線損壞
ping網(wǎng)關(guān)異常,問(wèn)題:配置文件有誤、網(wǎng)卡配置未生效
4、當(dāng)前3步還不能正常上外網(wǎng)的話。所有route查看默認(rèn)路由表。
處理方法:刪除不必要的路由信息,并保證默認(rèn)路由是從對(duì)應(yīng)網(wǎng)關(guān)地址出去的。
5、臨時(shí)停止iptables服務(wù)、SELinux服務(wù)、NetworkManager服務(wù)
6、如能上網(wǎng)但訪問(wèn)域名有異常時(shí),那將需要檢查/etc/hosts、/etc/resolv.conf兩個(gè)配置
7、假如以上6步檢查完畢之后,還發(fā)現(xiàn)不能上網(wǎng)。有如下可能。
7.1、主機(jī)MAC地址被路由器禁止上網(wǎng)
7.2、外網(wǎng)服務(wù)異常。如寬帶賬號(hào)欠費(fèi)、光纖被挖斷等物理攻擊。
下列貼士幫助你更快速更輕松地為 Linux 中的硬件排查故障。許多不同的因素可能導(dǎo)致Linux硬件出現(xiàn)問(wèn)題;在你開始嘗試診斷之前,了解最常見的問(wèn)題以及最有可能找到原因的環(huán)節(jié)是明智之舉。
Linux服務(wù)器在許多不同類型的基礎(chǔ)架構(gòu)中運(yùn)行關(guān)鍵任務(wù)型業(yè)務(wù)應(yīng)用程序,包括物理機(jī)、虛擬機(jī)、私有云、公共云和混合云。對(duì)于 Linux系統(tǒng) 管理員來(lái)說(shuō),了解如何管理Linux硬件基礎(chǔ)架構(gòu)很重要,包括與網(wǎng)絡(luò)和存儲(chǔ)有關(guān)的軟件定義功能、Linux容器和Linux服務(wù)器上的多個(gè)工具。
排查并解決Linux上與硬件有關(guān)的問(wèn)題可能需要一些時(shí)間。連經(jīng)驗(yàn)豐富的系統(tǒng)管理員有時(shí)也要花幾小時(shí)來(lái)解決莫名其妙的軟硬件問(wèn)題。
下列貼士幫助你更快速更輕松地為L(zhǎng)inux中的硬件排查故障。許多不同的因素可能導(dǎo)致Linux硬件出現(xiàn)問(wèn)題;在你開始嘗試診斷之前,了解最常見的問(wèn)題以及最有可能找到原因的環(huán)節(jié)是明智之舉。
1.快速診斷設(shè)備、模塊和驅(qū)動(dòng)程序
故障排查的第一步通常是顯示Linux服務(wù)器上安裝的硬件列表。你可以使用ls命令獲取硬件的詳細(xì)信息,比如lspci、lsblk、lscpu和lsscsi。比如說(shuō),這是lsblk命令的輸出結(jié)果:
#?lsblk
NAME????MAJ:MIN?RM?SIZE?RO?TYPE?MOUNTPOINT
xvda????202:0????0??50G??0?disk
├─xvda1?202:1????0???1M??0?part
└─xvda2?202:2????0??50G??0?part?/
xvdb????202:16???0??20G??0?disk
└─xvdb1?202:17???0??20G??0?part
如果ls命令沒有顯示任何錯(cuò)誤,使用初始化進(jìn)程(比如systemd)查看Linux服務(wù)器的運(yùn)行狀況。systemd是啟動(dòng)用戶空間、控制多個(gè)系統(tǒng)進(jìn)程的最流行的初始化進(jìn)程。比如說(shuō),這是systemctl status命令的輸出結(jié)果:
#?systemctl?status
●?bastion.f347.internal
State:?running
Jobs:?0?queued
Failed:?0?units
Since:?Wed?2018-11-28?01:29:05?UTC;?2?days?ago
CGroup:?/
├─1?/usr/lib/systemd/systemd?--switched-root?--system?--deserialize?21
├─kubepods.slice
│?├─kubepods-pod3881728a_f2af_11e8_af77_06af52f87498.slice
│?│?├─docker-88b27385f4bae77bba834fbd60a61d19026bae13d18eb147783ae27819c34967.scope
│?│?│?└─23860?/opt/bridge/bin/bridge?--public-dir=/opt/bridge/static?--config=/var/console-config/console-c
│?│?└─docker-a4433f0d523c7e5bc772ee4db1861e4fa56c4e63a2d48f6bc831458c2ce9fd2d.scope
│?│???└─23639?/usr/bin/pod
2.深入研究多個(gè)日志
dmesg讓你可以搞清楚內(nèi)核的最新信息中的錯(cuò)誤和警示內(nèi)容。比如說(shuō),這是dmesg | more命令的輸出結(jié)果:
#?dmesg?|?more
....
[?1539.027419]?IPv6:?ADDRCONF(NETDEV_UP):?eth0:?link?is?not?ready
[?1539.042726]?IPv6:?ADDRCONF(NETDEV_UP):?veth61f37018:?link?is?not?ready
[?1539.048706]?IPv6:?ADDRCONF(NETDEV_CHANGE):?veth61f37018:?link?becomes?ready
[?1539.055034]?IPv6:?ADDRCONF(NETDEV_CHANGE):?eth0:?link?becomes?ready
[?1539.098550]?device?veth61f37018?entered?promiscuous?mode
[?1541.450207]?device?veth61f37018?left?promiscuous?mode
[?1542.493266]?SELinux:?mount?invalid.??Same?superblock,?different?security?settings?for?(dev?mqueue,?type?mqueue)
[?9965.292788]?SELinux:?mount?invalid.??Same?superblock,?different?security?settings?for?(dev?mqueue,?type?mqueue)
[?9965.449401]?IPv6:?ADDRCONF(NETDEV_UP):?eth0:?link?is?not?ready
[?9965.462738]?IPv6:?ADDRCONF(NETDEV_UP):?vetheacc333c:?link?is?not?ready
[?9965.468942]?IPv6:?ADDRCONF(NETDEV_CHANGE):?vetheacc333c:?link?becomes?ready
....
你還可以查看/var/log/messages文件中的所有Linux系統(tǒng)日志,在這里找到與特定問(wèn)題有關(guān)的錯(cuò)誤。如果你對(duì)硬件進(jìn)行改動(dòng),比如掛載額外磁盤或添加以太網(wǎng)網(wǎng)卡,有必要通過(guò)tail命令實(shí)時(shí)密切關(guān)注信息。比如說(shuō),這是tail -f /var/log/messages命令的輸出結(jié)果:
#?tail?-f?/var/log/messages
Dec??1?13:20:33?bastion?dnsmasq[30201]:?using?nameserver?127.0.0.1#53?for?domain?in-addr.arpa
Dec??1?13:20:33?bastion?dnsmasq[30201]:?using?nameserver?127.0.0.1#53?for?domain?cluster.local
Dec??1?13:21:03?bastion?dnsmasq[30201]:?setting?upstream?servers?from?DBus
Dec??1?13:21:03?bastion?dnsmasq[30201]:?using?nameserver?192.199.0.2#53
Dec??1?13:21:03?bastion?dnsmasq[30201]:?using?nameserver?127.0.0.1#53?for?domain?in-addr.arpa
Dec??1?13:21:03?bastion?dnsmasq[30201]:?using?nameserver?127.0.0.1#53?for?domain?cluster.local
Dec??1?13:21:33?bastion?dnsmasq[30201]:?setting?upstream?servers?from?DBus
Dec??1?13:21:33?bastion?dnsmasq[30201]:?using?nameserver?192.199.0.2#53
Dec??1?13:21:33?bastion?dnsmasq[30201]:?using?nameserver?127.0.0.1#53?for?domain?in-addr.arpa
Dec??1?13:21:33?bastion?dnsmasq[30201]:?using?nameserver?127.0.0.1#53?for?domain?cluster.local
3.分析網(wǎng)絡(luò)功能
你可能在復(fù)雜的網(wǎng)絡(luò)環(huán)境中有成千上萬(wàn)個(gè)云原生應(yīng)用程序?yàn)闃I(yè)務(wù)服務(wù)提供服務(wù);這些可能包括虛擬化、多云和混合云。這意味著你應(yīng)該分析網(wǎng)絡(luò)連接是否正常運(yùn)行,這是故障排查的一部分。分析Linux服務(wù)器中網(wǎng)絡(luò)功能的實(shí)用命令包括ip addr、traceroute、nslookup、dig和ping等。比如說(shuō),這是ip addr show命令的輸出結(jié)果:
#?ip?addr?show
1:
lo:?LOOPBACK,UP,LOWER_UP?mtu?65536?qdisc?noqueue?state?UNKNOWN?group?default?qlen?1000
link/loopback?00:00:00:00:00:00?brd?00:00:00:00:00:00
inet?127.0.0.1/8?scope?host?lo
valid_lft?forever?preferred_lft?forever
inet6?::1/128?scope?host
valid_lft?forever?preferred_lft?forever
2:
eth0:?BROADCAST,MULTICAST,UP,LOWER_UP?mtu?9001?qdisc?mq?state?UP?group?default?qlen?1000
link/ether?06:af:52:f8:74:98?brd?ff:ff:ff:ff:ff:ff
inet?192.199.0.169/24?brd?192.199.0.255?scope?global?noprefixroute?dynamic?eth0
valid_lft?3096sec?preferred_lft?3096sec
inet6?fe80::4af:52ff:fef8:7498/64?scope?link
valid_lft?forever?preferred_lft?forever
3:
docker0:?NO-CARRIER,BROADCAST,MULTICAST,UP?mtu?1500?qdisc?noqueue?state?DOWN?group?default
link/ether?02:42:67:fb:1a:a2?brd?ff:ff:ff:ff:ff:ff
inet?172.17.0.1/16?scope?global?docker0
valid_lft?forever?preferred_lft?forever
inet6?fe80::42:67ff:fefb:1aa2/64?scope?link
valid_lft?forever?preferred_lft?forever
....
結(jié)束語(yǔ)
Linux硬件故障排查需要具備相當(dāng)扎實(shí)的知識(shí),包括如何使用功能強(qiáng)大的命令行工具、解讀系統(tǒng)日志。你還應(yīng)該知道如何診斷內(nèi)核空間,可以在內(nèi)核空間找到許多硬件問(wèn)題的根本原因。請(qǐng)記住,Linux中的硬件問(wèn)題可能由許多不同的方面引起,包括設(shè)備、模塊、驅(qū)動(dòng)程序、BIOS、網(wǎng)絡(luò),甚至是舊硬件故障。
1.1 top
1.2 vmstat
r 表示可運(yùn)行進(jìn)程數(shù)目,數(shù)據(jù)大致相符;而b表示的是 uninterruptible 睡眠的進(jìn)程數(shù)目;swpd 表示使用到的虛擬內(nèi)存數(shù)量,跟 top-Swap-used 的數(shù)值是一個(gè)含義,而如手冊(cè)所說(shuō),通常情況下 buffers 數(shù)目要比 cached Mem 小的多,buffers 一般20M這么個(gè)數(shù)量級(jí);io 域的 bi、bo 表明每秒鐘向磁盤接收和發(fā)送的塊數(shù)目(blocks/s);system 域的 in 表明每秒鐘的系統(tǒng)中斷數(shù)(包括時(shí)鐘中斷),cs表明因?yàn)檫M(jìn)程切換導(dǎo)致上下文切換的數(shù)目。
說(shuō)到這里,想到以前很多人糾結(jié)編譯 linux kernel 的時(shí)候 -j 參數(shù)究竟是 CPU Core 還是 CPU Core+1?通過(guò)上面修改 -j 參數(shù)值編譯 boost 和 linux kernel 的同時(shí)開啟 vmstat 監(jiān)控,發(fā)現(xiàn)兩種情況下 context switch 基本沒有變化,且也只有顯著增加 -j 值后 context switch 才會(huì)有顯著的增加,看來(lái)不必過(guò)于糾結(jié)這個(gè)參數(shù)了,雖然具體編譯時(shí)間長(zhǎng)度我還沒有測(cè)試。資料說(shuō)如果不是在系統(tǒng)啟動(dòng)或者 benchmark 的狀態(tài),參數(shù) context switch100000 程序肯定有問(wèn)題。
1.3 pidstat
如果想對(duì)某個(gè)進(jìn)程進(jìn)行全面具體的追蹤,沒有什么比 pidstat 更合適的了——??臻g、缺頁(yè)情況、主被動(dòng)切換等信息盡收眼底。這個(gè)命令最有用的參數(shù)是-t,可以將進(jìn)程中各個(gè)線程的詳細(xì)信息羅列出來(lái)。
-r: 顯示缺頁(yè)錯(cuò)誤和內(nèi)存使用狀況,缺頁(yè)錯(cuò)誤是程序需要訪問(wèn)映射在虛擬內(nèi)存空間中但是還尚未被加載到物理內(nèi)存中的一個(gè)分頁(yè),缺頁(yè)錯(cuò)誤兩個(gè)主要類型是
-s:棧使用狀況,包括 StkSize 為線程保留的??臻g,以及 StkRef 實(shí)際使用的??臻g。使用ulimit -s發(fā)現(xiàn)CentOS 6.x上面默認(rèn)??臻g是10240K,而 CentOS 7.x、Ubuntu系列默認(rèn)棧空間大小為8196K
1.4 其他
while :; do ps -eo user,pid,ni,pri,pcpu,psr,comm | grep 'ailawd'; sleep 1; done
2.1 iostat
3.1 netstat
? ~ netstat -antp #列出所有TCP的連接
? ~ netstat -nltp #列出本地所有TCP偵聽套接字,不要加-a參數(shù)
3.2 sar
3.3 tcpdump
服務(wù)器出現(xiàn)由內(nèi)存問(wèn)題引發(fā)的故障,例如系統(tǒng)內(nèi)部服務(wù)響應(yīng)速度變慢、服務(wù)器登錄不上、系統(tǒng)觸發(fā) OOM(Out Of Memory)等。通常情況下當(dāng)實(shí)例內(nèi)存使用率持續(xù)高于90%時(shí),可判斷為實(shí)例內(nèi)存使用率過(guò)高。CPU/內(nèi)存使用率過(guò)高的問(wèn)題原因可能由硬件因素、系統(tǒng)進(jìn)程、業(yè)務(wù)進(jìn)程或者木馬病毒等因素導(dǎo)致。
筆者以前寫過(guò)一篇文章- Linux 下的 60 秒分析的檢查清單 ,適用于 任何性能問(wèn)題 的分析工作,這一篇文章是關(guān)于CPU/內(nèi)存使用率的具體的排查思路總結(jié)。
執(zhí)行?top?命令后按? M ,根據(jù)駐留內(nèi)存大小進(jìn)行排序,查看 “RES” 及 “SHR” 列是否有進(jìn)程占用內(nèi)存過(guò)高。按 P,以 CPU 占用率大小的順序排列進(jìn)程列表,查看是否有進(jìn)程占用cpu過(guò)高。
如果有異常進(jìn)程占用了大量 CPU 或內(nèi)存資源,記錄需要終止的進(jìn)程 PID,輸入k,再輸入需要終止進(jìn)程的 PID ,按?Enter。
另外說(shuō)明一下,top 運(yùn)行中可以通過(guò) top 的內(nèi)部命令對(duì)進(jìn)程的顯示方式進(jìn)行控制,最常用的是M和P。
CPU 空閑但高負(fù)載情況,Load average 是 CPU 負(fù)載的評(píng)估,其值越高,說(shuō)明其任務(wù)隊(duì)列越長(zhǎng),處于等待執(zhí)行的任務(wù)越多。執(zhí)行ps -axjf命令,查看進(jìn)程狀態(tài),并檢查是否存在 D 狀態(tài)進(jìn)程。D 狀態(tài)指不可中斷的睡眠狀態(tài),該狀態(tài)進(jìn)程無(wú)法被殺死,也無(wú)法自行退出。若出現(xiàn)較多 D 狀態(tài)進(jìn)程,可通過(guò)恢復(fù)該進(jìn)程依賴資源或重啟系統(tǒng)進(jìn)行解決。
Linux 系統(tǒng)通過(guò)分頁(yè)機(jī)制管理內(nèi)存的同時(shí),將磁盤的一部分劃出來(lái)作為虛擬內(nèi)存。而 kswapd0 是 Linux 系統(tǒng)虛擬內(nèi)存管理中負(fù)責(zé)換頁(yè)的進(jìn)程。當(dāng)系統(tǒng)內(nèi)存不足時(shí),kswapd0 會(huì)頻繁的進(jìn)行換頁(yè)操作。換頁(yè)操作非常消耗 CPU 資源,導(dǎo)致該進(jìn)程持續(xù)占用高 CPU 資源。
執(zhí)行top命令,找到 kswapd0 進(jìn)程。觀察 kswapd0 進(jìn)程狀態(tài),若持續(xù)處于非睡眠狀態(tài),且運(yùn)行時(shí)間較長(zhǎng)并持續(xù)占用較高 CPU 資源,執(zhí)行?vmstat?,free,ps?等指令,查詢系統(tǒng)內(nèi)進(jìn)程的內(nèi)存占用情況,重啟系統(tǒng)或終止不需要且安全的進(jìn)程。如果 si,so 的值也比較高,則表示系統(tǒng)存在頻繁的換頁(yè)操作,當(dāng)前系統(tǒng)的物理內(nèi)存已經(jīng)不能滿足您的需要。? si ?表示每秒從交換區(qū)寫入內(nèi)存的大小(單位:kb/s) , so ?每秒從內(nèi)存寫到交換區(qū)的大小。
執(zhí)行cat/proc/meminfo |grep-i shmem命令查看共享內(nèi)存。
? ? buddy可以以頁(yè)為單位獲取連續(xù)的物理內(nèi)存了,即4K為單位。slab負(fù)責(zé)需要頻繁的獲取/釋放并不大的連續(xù)物理內(nèi)存,比如幾十字節(jié)。執(zhí)行cat /proc/meminfo | grep -i SUnreclaim命令查看slab 內(nèi)存。
? ? 標(biāo)準(zhǔn)的 4KB 大小的頁(yè)面外,內(nèi)存大頁(yè)管理內(nèi)存中的巨大的頁(yè)面,處理較少的頁(yè)面映射表,從而減少訪問(wèn)/維護(hù)它們的開銷。執(zhí)行cat /proc/meminfo | grep -iE "HugePages_Total|Hugepagesize" 查看內(nèi)存大頁(yè)。
內(nèi)存使用率計(jì)算:
(Total - available)100% / Total
(Total - Free - Buffers - Cached - SReclaimable + Shmem)* 100% / Total
cat /proc/meminfo查看信息含義:
centos在安裝一些包時(shí)可能報(bào)錯(cuò):no package xxx available,這是因?yàn)閏entos從rh發(fā)展而來(lái),去掉了一些軟件包,可以先把epel(Extra Packages for Enterprise Linux)先安裝后再安裝對(duì)應(yīng)軟件包