匯總Linux系統運維中遇到的問題
匯總Linux系統運維中遇到的問題
1、fdisk 磁盤分區報錯
GPT PMBR size mismatch (20971519 != 83886079) will be corrected by w(rite).
GPT PMBR size mismatch (20971519 != 83886079) will be corrected by w(rite).
這個錯誤通常是由于磁盤分區表(partition table)與磁盤本身的大小不匹配所導致的。這可能是由于一個分區表被意外地覆蓋或者磁盤被重新分區而導致的。parted -l 列出磁盤分區時將提示修復。
parted -l
2、控制臺打印 audit: backlog limit exceeded
audit: backlog limit exceeded 的記錄意味著系統審計日志的緩沖區已滿,導致一些記錄無法寫入日志文件中,這可能會導致一些安全事件被丟失。通常,這是由于系統的審計日志速度太快而導致的,而系統無法及時處理所有的記錄。這可以通過增加系統審計日志緩沖區的大小來解決。可以通過修改 /etc/audit/audit.rules 文件中的 --backlog 參數來增加緩沖區的大小。例如,將 --backlog 參數的值從默認的8192增加到16384可以將緩沖區的大小翻倍。修改完后,您可能需要重新啟動 auditd 服務才能使更改生效。
3、關于linux系統資源限制命令和內核參數
ulimit -u # 查看當前用戶的最大進程數
ulimit -n # 查看當前用戶的最大打開文件數
ulimit -a # 查看當前所有資源限制
cat /proc/sys/kernel/pid_max # 查看系統中可創建的進程數
cat /proc/sys/fs/file-max # 查看系統中可打開的文件數
/etc/security/limits.conf # 限制每個用戶可用的最大進程數量和最多可打開的文件描述符的軟限制和硬限制
/etc/security/limits.d/20-nproc.conf # 限制每個用戶可用的最大進程數量的軟限制和硬限制
/etc/sysctl.conf kernel.pid_max # 該參數限制系統中可創建的進程數
/etc/sysctl.conf fs.file-max # 該參數限制系統中可打開的文件數
ulimit -SHn 65536 # 臨時設置當前用戶文件限制、重啟失效
ulimit -SHu 65536 # 臨時設置當前用戶進程限制、重啟失效
su - user1 -c 'ulimit -SHn 65536' # 臨時設置用戶user1文件限制、重啟失效
su - user1 -c 'ulimit -SHu 65536' # 臨時設置用戶user1進程限制、重啟失效
# 設置的硬限制如果超出了系統的最大限制,那么以系統的最大限制為準
# 軟限制是用戶可以自行調整的當前限制,軟限制可以增加到硬限制的值
# 硬限制是軟限制的上限值,只有root用戶可以增加硬限制,任何用戶都可以降低硬限制
4、嵌套虛擬化實驗環境下網絡不通
混雜模式(Promiscuous Mode)是一種網絡接口的工作狀態,在這種狀態下,網卡能夠接收所有經過它的數據流,而不論其目的地址是否是它本身。因此,嵌套虛擬化環境下的虛擬機作為宿主機使用時,需要開啟網卡的混雜模式。
5、動態掃描主機scsi LUN
for host in /sys/class/scsi_host/host*/scan; do echo "- - -" > "$host"; done
6、MySQL數據庫初始更改特權用戶密碼及開啟遠程連接
systemctl enable mysqld.service --now
grep "password" /var/log/mysqld.log
> SELECT `USER`,AUTHENTICATION_STRING,`HOST` FROM MYSQL.USER;
> ALTER USER 'ROOT'@'LOCALHOST' IDENTIFIED BY '123456';
> GRANT ALL PRIVILEGES ON *.* TO 'ROOT'@'%' IDENTIFIED BY '123456';
> FLUSH PRIVILEGES;
> CREATE DATABASE SAMPLEDB;
7、格式化文件系統速度很慢
根源:mkfs命令在磁盤上發出塊丟棄命令,但底層存儲設備無法處理它。增加-K選項可以避免此問題。
-K Keep, do not attempt to discard blocks at mkfs time
(discarding blocks initially is useful on solid state
devices and sparse / thin-provisioned storage).
# mkfs.ext4 -K </dev/mapper/path_to_lvm_volume> # For ext4 filesystem
# mkfs.xfs -K </dev/mapper/path_to_lvm_volume> # For XFS filesystem
https://access.redhat.com/solutions/727333
8、dd命令遠程測速
# 本地:192.168.200.1
# 遠程:192.168.200.2
# 遠程到本地
ssh root@192.168.200.2 -p 22 dd if=/root/test.bin | dd of=/root/test.bin
ssh root@192.168.200.2 -p 22 dd if=/dev/mapper/centos-root bs=4K count=1024000 | dd of=/root/test.bin
# 本地到遠程
dd if=/root/test.bin | ssh -p 22 root@192.168.200.2 dd of=/root/test.bin
dd if=/dev/mapper/centos-root bs=4K count=1024000 | ssh -p 22 root@192.168.200.2 dd of=/root/test.bin
9、屏蔽服務日志(如審計服務)輸出到messages文件
vim /etc/rsyslog.conf
:programname, isequal, "audit" stop
*.info;mail.none;authpriv.none;cron.none /var/log/messages
# 或者
if $programname == 'audit' then stop
*.info;mail.none;authpriv.none;cron.none /var/log/messages
# 重啟rsyslog
systemctl restart rsyslog
10、網卡綁定
# 配置網絡綁定
nmcli connection add type bond con-name bond0 ifname bond0 bond.options "mode=active-backup,miimon=1000"
nmcli connection add type ethernet slave-type bond con-name bond0-ens37 ifname ens37 master bond0
nmcli connection add type ethernet slave-type bond con-name bond0-ens38 ifname ens38 master bond0
nmcli connection modify bond0 ipv4.method manual ipv4.addresses 192.168.100.152/24 ipv4.gateway 192.168.100.2 ipv4.dns 192.168.200.2
nmcli connection up bond0
nmcli connection up bond0-ens37
nmcli connection up bond0-ens38
# 在綁定網絡上配置VLAN標記
nmcli connection delete bond0
nmcli connection add type bond con-name bond0 ifname bond0 bond.options "mode=active-backup,miimon=1000"
nmcli connection modify bond0 ipv4.method disabled
nmcli connection add type vlan con-name bond0.100 ifname bond0.100 vlan.parent bond0 vlan.id 100
nmcli connection add type vlan con-name bond0.200 ifname bond0.200 vlan.parent bond0 vlan.id 200
nmcli connection modify bond0.100 ipv4.method manual ipv4.addresses 192.168.100.152/24 ipv4.gateway 192.168.100.2 ipv4.dns 192.168.100.2
nmcli connection modify bond0.200 ipv4.method manual ipv4.addresses 192.168.200.152/24 ipv4.gateway 192.168.200.2 ipv4.dns 192.168.200.2
nmcli connection up bond0
nmcli connection up bond0.100
nmcli connection up bond0.200
# 查看連接配置和綁定信息
nmcli connection show
cat /proc/net/bonding/bond0
# 刪除連接配置
nmcli connection delete bond0
nmcli connection delete bond0-ens37
nmcli connection delete bond0-ens38
nmcli connection delete bond0.100
nmcli connection delete bond0.200
依賴綁定模式的上游交換機配置:
| 綁定模式 | 交換機上的配置 |
|---|---|
0 - balance-rr |
需要啟用靜態 EtherChannel,而不是鏈路聚合控制協議(LACP)協商。 |
1 - active-backup |
交換機上不需要任何配置。 |
2 - balance-xor |
需要啟用靜態 EtherChannel,而不是 LACP 協商。 |
3 - broadcast |
需要啟用靜態 EtherChannel,而不是 LACP 協商。 |
4 - 802.3ad |
需要啟用 LACP 協商的 EtherChannel。 |
5 - balance-tlb |
交換機上不需要任何配置。 |
6 - balance-alb |
交換機上不需要任何配置。 |
11、策略路由
# 需求:修改輔網卡的默認路由表,修改為編號200,并增加輔網卡路由表規則,讓本機192.168.200.100發出的數據包走編號200的路由表。
nmcli connection modify ens37 ipv4.route-table 200
nmcli connection modify ens37 ipv4.routing-rules "priority 32000 from 192.168.200.100 table 200"
systemctl restart network
# 修改成功后查看路由策略規則,以及查看路由表
ip rule list
ip route show table 200
ip route show table main
12、引導修復及單用戶模式磁盤操作
# 手動引導
grub > set root=hd0,msdos1
grub > linux /vmlinuz-3.10.0-957.el7.x86_64 root=/dev/mapper/centos-root
grub > initrd /initramfs-3.10.0-957.el7.x86_64.img
grub > boot
# 配置變更
[ -d /sys/firmware/efi ] && echo UEFI || echo BIOS # 啟動方式判斷
grub2-editenv /boot/efi/EFI/centos/grubenv set next_entry=1 # UEFI 設置下次啟動條目
grub2-editenv /boot/grub2/grubenv set next_entry=1 # BIOS 設置下次啟動條目
grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg # UEFI 更新grub配置
grub2-mkconfig -o /boot/grub2/grub.cfg # BIOS 更新grub配置
# For Ubuntu
sudo sed -i 's/^GRUB_TIMEOUT_STYLE=hidden/GRUB_TIMEOUT_STYLE=menu/' /etc/default/grub
sudo sed -i 's/^GRUB_TIMEOUT=0/GRUB_TIMEOUT=5/' /etc/default/grub
sudo update-grub
sudo cp /boot/grub/grub.cfg /boot/efi/EFI/ubuntu/grub.cfg # For UEFI
# 邏輯卷激活
vgchange -ay
vgimportclone -n newcentos /dev/sdb2 # 如果vg重命 重命名為newcentos
vgchange newcentos -ay
# 臨時文件系統掛載
mount /dev/sdb2 /sysroot
mount --bind /sys /sysroot/sys
mount --bind /proc /sysroot/proc
mount --bind /dev /sysroot/dev
mount --bind /run /sysroot/run
mount --bind /tmp /sysroot/tmp
chroot /sysroot
13、Device #015 does not seem to be present
無法啟動網絡服務,查看messages日志/etc/sysconfig/network-scripts/ifup-eth[1995]: Device ens33#015 does not seem to be present, delaying initialization,其中設備名解析中多了#015。
原因是網絡配置文件行尾換行符為Windows系統下的換行符導致,使用cat -A命令查看行尾為^M$,Unix系統下的換行符則只有$。日志信息中的015是8進制數字表示方式。
在ASCII編碼中,有以下兩個控制字符:
/012(八進制)= 0x0A(十六進制)代表換行(Line Feed,簡稱LF),對應的特殊轉義字符是"/n"。
/015(八進制)= 0x0D(十六進制)代表回車(Carriage Return,簡稱CR),對應的特殊轉義字符是"/r"。
因此"/015/012"代表"/r/n"就是先回車、再換行,Windows是用這個組合作為換行符。而"/n"是Unix用來表示的換行。
14、RX dropped
從內核2.6.37版本開始,丟棄數據包計數的含義已經發生了變化。在之前,數據包被丟棄最可能是因為出現了錯誤。現在,rx_dropped計數器顯示了由于以下原因而被丟棄的數據幀的統計信息:
- Softnet backlog full — (Measured from /proc/net/softnet_stat)
- Bad / Unintended VLAN tags
- Unknown / Unregistered protocols
- IPv6 frames when the server is not configured for IPv6
解釋過來就是:
1、數據包的處理速度跟不上數據包接收的速度,導致系統內部的接收隊列(也稱為軟中斷隊列)被填滿。
2、數據包帶有錯誤的VLAN標簽,或者系統沒有預期接收該VLAN標簽的數據包。
3、數據包可能包含了一個系統不認識或未配置的協議類型,或者系統不知道如何處理這種協議的數據包。
4、如果服務器沒有啟用或配置IPv6支持,但收到了IPv6的數據包,那么這些數據包將無法被正確解析或處理。
如果任何數據幀滿足上述條件之一,它們將在協議棧之前被丟棄,并且rx_dropped計數器的值會增加。
15、文件莫名消失的問題
新掛載/home到新硬盤時,/home原來數據變空了,這個原因是由于Linux的VFS(虛擬文件系統)機制導致的,正常登錄以后,所看到的各個目錄,文件都是內核在加載時候構造在內存中的VFS目錄樹,而不是直接看到硬盤上的實際目錄樹。當你掛載某個設備到一個VFS掛載點上時(比如/home),系統就把VFS中的這個掛載點/home指向你最后所掛載的那個設備上。那么你現在訪問該掛載點時,就會看到你最后掛載在此處的設備。而之前所掛載的設備依然在那里,只不過掛載點/home已經不再指向之前的設備。所以之前的數據是被隱藏了,但并沒有刪除,若umount掛載后,數據又重新回來了。
16、捕獲進程退出狀態碼
#!/bin/bash
# 啟動一個后臺進程
sleep 100 &
# 獲取后臺進程的 PID
PID=$!
# 等待該后臺進程完成
wait $PID
# 獲取并打印退出狀態碼
EXIT_STATUS=$?
echo "The background process exited with status $EXIT_STATUS"
17、服務單元Type=forking
當服務單元被設置為 Type=forking 時,systemd 期望該服務在啟動時會創建出一個或多個子進程,并且服務本身(父進程)會退出。典型的例子是傳統的 UNIX 守護進程,它們在啟動時會派生出一個子進程來處理實際的工作,然后父進程會退出。(Type=forking只是為了兼容性)。于是,如果守護進程分叉兩次或者它在其他方面表現異常,則可能存在競爭。
https://systemd-devel.freedesktop.narkive.com/eDM9b83I/possible-bug-guessing-mainpid-when-service-type-forking
https://www.freedesktop.org/software/systemd/man/latest/systemd.service.html#Options
18、ping: sendmsg: Invalid argument
net ratelimit:xxx callbacks suppressed
原因:arp表滿了導致
# 查看系統配額
sysctl -a | grep net.ipv4.neigh.default.gc_thresh
# 查看當前arp條目數目
ip neigh | wc -l
# 解決方案:根據實際arp最大值情況(比如訪問其他子機最大個數),調整arp表大小
sudo sysctl -w net.ipv4.neigh.default.gc_thresh1=1024
sudo sysctl -w net.ipv4.neigh.default.gc_thresh2=2048
sudo sysctl -w net.ipv4.neigh.default.gc_thresh3=4096
19、動態鏈接器在運行時未能找到所需的共享庫
動態鏈接器加載的優先級:LD_LIBRARY_PATH > /etc/ld.so.conf.d/ > /etc/ld.so.conf > /lib/ > /lib64/
- 修改
LD_LIBRARY_PATH環境變量(臨時生效):export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH - 更新
ld.so.cache(永久生效):echo '/usr/local/lib' | tee -a /etc/ld.so.conf.d/local.conf ldconfig
20、sshd服務開啟端口轉發
編輯sshd服務配置文件,修改參數AllowTcpForwarding yes,斷開所有的ssh會話后生效。
21、systemd: Unit xxx.mount is bound to inactive unit xxxx.device. Stopping, too
systemctl daemon-reload
22、mount: /mnt: mount failed: Operation not permitted.
可能的原因:1、普通用戶沒有權限執行mount;2、系統loop模塊有問題
mount CentOS-7-x86_64-DVD-1810.iso /mnt # 實際上等同于執行了
mount -t iso9660 -o loop CentOS-7-x86_64-DVD-1810.iso /mnt # 系統會強制加載loop模塊(loop.ko)
modprobe loop # 嘗試是否可以手動加載loop模塊
23、引導選項用于禁用指定的驅動程序
# 啟動引導增加modprobe.blacklist=,比如禁用ahci和firewire_ohci
GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=centos/root rhgb quiet modprobe.blacklist=ahci,firewire_ohci"
24、執行sudo命令報錯
sudo: pam_open_session: Permission denied
sudo: policy plugin failed session initialization
# 排錯思路:
# 1、/etc/security/ulimits.conf文件中nofile的軟硬限制的值不能超過內核參數/proc/sys/fs/nr_open設置的值
# 2、chage -l user01 查看用戶密碼是否過期
25、安裝桌面環境后不顯示
可能是原因:服務lightdm未啟動或啟動失敗,可能是因為系統中缺少lightdm用戶,lightdm用戶由包lightdm安裝時自動創建。
查看/etc/passwd、/etc/shadow、/etc/group等關鍵文件的attr屬性,是否增加了i屬性,導致未能成功創建用戶。
26、Limit for the maximum number of semaphores reached
某些LVM 命令(lvcreate、lvremove、dmsetup resume 等)可能會由于信號量短缺而失敗,并出現以下錯誤:
Limit for the maximum number of semaphores reached. You can check and set the limits in /proc/sys/kernel/sem.
解決:
更新tuned至0.2.19-16.el6(隨RHBA-2016-0787發布)或更高版本,其中包含針對此問題的修復。
如果不使用ktune/tuned
使用echo "750 288000 300 384" > /proc/sys/kernel/sem增加信號量限制(750*384 = 288000)
如果使用 ktune/tuned
一種解決方法是復制ktune/tuned配置文件中用于kernel.sem可調參數的值,并將其添加到/etc/sysctl.conf文件中。
根本原因:
LVM 設備上的狀態更改會觸發 udev 事件,該事件會通過停止/啟動序列重新啟動 ktune/tuned 服務。當 ktune/tuned 服務停止時,kernel.sem 可調參數將恢復為系統默認值或 /etc/sysctl.conf 中的值。如果此值小于 ktune/tuned 服務配置文件使用的值,則信號量不足可能會導致這些故障。
27、Ubuntu系統打開文件限制數修改后仍然顯示1024
Ubuntu系統修改打開文件限制數,配置/etc/securty/limits.conf最好指明用戶,不要使用*,因為使用*,在root用戶下查詢,顯示為1024,不會顯示更改后的值。但實際已經生效(比如切換到任何一個普通用戶,查詢就是修改后的值)。
28、NetworkManager禁用自動連接的創建
默認情況下,NetworkManager 會自動為磁盤上沒有其他候選連接的每臺以太網設備創建一個新的內存連接。這些新連接的名稱為“有線連接 1”、“有線連接 2”等等;它們啟用了 DHCPv4 和 IPv6 自動配置。
這種行為在服務器上通常是不受歡迎的,因為服務器上的所有接口都應該明確配置。要禁用此類自連接的創建,請添加no-auto-default=*到[main] 配置部分。配置文件路徑為:/usr/lib/NetworkManager/conf.d/00-server.conf
29、執行yum或rpm命令報錯:error: Failed to initialize NSS library
使用strace -eopen rpm指令跟蹤open系統調用,查看出錯時的最后一個調用的動態庫文件,基本上問題就出在這個動態庫文件上。
30、NetworkManager兼容ipv4的ipv6路由解析異常
該問題是NetworkManager低版本的bug,操作流程完全一致,生成的ipv6路由配置文件內容也一致,但生成的內核ipv6路由表卻不一致。
nmcli connection modify ens33 +ipv6.routes "FD00:D40::7.178.64.0/114 FD00:D40::7.178.64.254"
nmcli connection down ens33 && nmcli connection up ens33
cat /etc/sysconfig/network-scripts/route6-ens33
fd00:d40::7b2:4000/114 via fd00:d40::7b2:40fe
查看內核ipv6路由表(僅測試了部分版本)
ip -6 route
fd00:d40::b2:4000/114 via fd00:d40::7b2:40fe dev ens33 proto static metric 104 pref medium # 1.16.0及以下版本,解析錯誤
fd00:d40::7b2:4000/114 via fd00:d40::7b2:40fe dev ens33 proto static metric 104 pref medium # 1.26.2及以上版本,解析正常
31、讓CPU保持在90%以上
for i in `seq 1 $(cat /proc/cpuinfo |grep "physical id" |wc -l)`; do cat /dev/urandom | md5sum & done
for i in `seq 1 $(cat /proc/cpuinfo |grep "physical id" |wc -l)`; do dd if=/dev/zero of=/dev/null & done
for i in `seq 1 $(cat /proc/cpuinfo |grep "physical id" |wc -l)`; do openssl speed rsa & done
pkill -9 cat
pkill -9 dd
pkill -9 openssl
yum install -y sysbench
sysbench --threads=100 --events=80000 cpu --cpu-max-prime=8000000 run
pkill sysbench
yum install -y stress
stress --cpu 8 --timeout 600
pkill stress
32、Failed to start Switch Root. See 'systemctl status initrd-switch-root.service' for details.
可能原因:根文件系統沒有掛載或者根文件系統缺少os-release文件
33、unknown filesystem type 'nfsd'
modprobe nfsd
34、異常斷電導致文件內容丟失(文件在緩存區還沒來得及落盤)
為了實現數據實時落盤,需要調整內核參數,使得臟數據在緩存中的停留時間盡可能短,且一旦有數據寫入緩存就盡快落盤。
cat >>/etc/sysctl.conf<<EOF
vm.dirty_background_bytes = 0
vm.dirty_background_ratio = 1
vm.dirty_bytes = 0
vm.dirty_expire_centisecs = 100 # 縮短到1秒
vm.dirty_ratio = 5
vm.dirty_writeback_centisecs = 100 # 縮短到1秒
vm.dirtytime_expire_seconds = 10 # 縮短到10秒
EOF
35、PROMPT_COMMAND
?PROMPT_COMMAND?是Bash shell中的一個環境變量,用戶在每次顯示主提示符之前,shell會檢查PROMPT_COMMAND環境變量。如果這個變量被設置了,Bash會在顯示主提示符之前執行其值指定的命令。示例:
?顯示當前時間?:export PROMPT_COMMAND='echo -n "當前時間: $(date "+%H:%M:%S")"'
?自定義提示信息?:export PROMPT_COMMAND='PS1="在 $(pwd) > "'?
可通過PROMPT_COMMAND='history -a; history -n'配置,使每條命令執行后立即追加到文件,避免丟失。
36、Ubuntu因防火墻規則導致的網絡通信異常
iptables-legacy基于傳統的Netfilter框架,通過一系列內核模塊(如iptable_filter、iptable_nat等)來實現規則的處理和執行。而iptables-nft則基于nftables框架,nftables利用自身更高效的規則管理和匹配算法,以及新的數據結構來處理網絡數據包過濾和轉換任務。
Docker的網絡功能(如端口映射、網絡隔離)依賴于傳統的iptables規則(iptables-legacy)。雖然iptables-nft提供了兼容層,但在某些情況下,Docker可能無法正確解析或應用這些規則,導致網絡初始化失敗。
解決:運行sudo update-alternatives --config iptables切換iptables實現,系統會提示選擇iptables的實現方式。iptables --version查看當前使用的框架。
sudo update-alternatives --config iptables
sudo iptables --version
在使用iptables-nft(默認)的場景下,使用iptables -nL與使用iptables-legacy -nL會看到兩套不同的規則。
sudo iptables -I INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables-legacy -I INPUT -p tcp --dport 22 -j ACCEPT
sudo iptables -nL
sudo iptables-legacy -nL
37、Ubuntu修改cgroup版本
# 查看cgroup版本
sudo stat -fc %T /sys/fs/cgroup
cgroup2fs
# 修改grub配置
sudo vim /etc/default/grub
# GRUB_CMDLINE_LINUX中新增systemd.unified_cgroup_hierarchy=0
GRUB_CMDLINE_LINUX="quiet splash systemd.unified_cgroup_hierarchy=0"
# 更新grub并重啟
sudo update-grub
reboot
# 再次驗證
sudo stat -fc %T /sys/fs/cgroup
tmpfs
38、VMware Workstation中綁定網卡切換主備后無法通信
虛擬機bond0網卡模式為mode1(active-backup),成員為ens33和ens37,默認active網卡是ens33,切換active網卡為ens37后,虛擬機無法正常通信。
在虛擬機內部使用tcpdump在ens37上抓包(會使ens37進入混雜模式),發現虛擬機可以正常通信。隨即手動將ens37設置為混雜模式,虛擬機正常通信。
# 切換active網卡為ens37
ifenslave -c bond0 ens37
# 將ens37設置為混雜模式
ip link set ens37 promisc on
39、iostat中有關%util的解釋
man手冊中的解釋:
Percentage of elapsed time during which I/O requests were issued to the device (bandwidth utilization for the device).Device saturation occurs when this value is close to 100% for devices serving requests serially. But for devices serv‐ing requests in parallel, such as RAID arrays and modern SSDs, this number does not reflect their performance limits.
該參數極具誤導性:
像傳統的機械硬盤(HDD)通常是串行處理 I/O 請求的,也就是一次只能處理一個請求。當 %util 接近 100% 時,說明磁盤一直在忙碌地處理 I/O 請求,幾乎沒有空閑時間,新的 I/O 請求就需要排隊等待處理,這時候磁盤就達到了飽和狀態,可能會導致 I/O 響應時間變長,系統性能下降。RAID 陣列和現代 SSD 可以同時處理多個 I/O 請求,具有并行處理能力。即使 %util 達到 100%,也不意味著這些設備已經達到了它們的性能上限。因為它們可以同時處理多個請求,在 %util 顯示為 100% 時,可能只是表示設備一直在忙碌,但實際上還有能力處理更多的請求。所以,對于這類并行處理設備,不能僅僅依靠 %util 指標來判斷其性能是否達到極限,還需要結合其他指標,如每秒的 I/O 操作次數(IOPS)、數據傳輸速率等進行綜合評估。
40、CPU異常占用率100%
通過常規手段包括top、vmstat、htop、atop以及/proc目錄,均無法找到CPU占用率高的進程,但是CPU使用率確實為100%。
首先懷疑的是top命令的統計錯誤,但其他命令也是如此,包括從node exporter中采集到是CPU使用率也是100%,由此懷疑是病毒導致但沒有根據。
最終通過perf top命令查詢到是24個異常進程導致,這24個進程只有進程PID,除此外找不到任何有關該PID的信息。
通過ps、/proc目錄查詢均不存在這些PID。但詭異的是卻能向PID發送KILL信號。向其中一個PID發送KILL信號,再次查看恢復正常,24個進程全部消失了。
perf top --sort pid,comm
41、系統負載高但CPU利用率低
top查看負載,1分鐘5分鐘15分鐘都達到了800+,且一直無法降下來,但實際使用并無明顯異常。
原因:Linux上的高系統負載不僅來自CPU需求,還來自磁盤I/O需求。更具體地說,是出于某種原因進入不可中斷睡眠狀態D的線程數量。
參考:https://tanelpoder.com/posts/high-system-load-low-cpu-utilization-on-linux/
42、ssh連接卡在debug1: pledge: network
根因:如果dbus服務由于某種原因重新啟動,您還需要重新啟動systemd-logind。
systemctl restart systemd-logind
其他可能的原因:GSSAPIAuthentication、UseDNS、/var/log/btmp文件巨大(:>/var/log/btmp)、rsyslog服務(systemctl restart rsyslog)
43、CentOS中環境變量加載順序
# 1. 交互式登錄 Shell(Interactive Login Shell)
# 登錄:/etc/profile → /etc/profile.d/*.sh → ~/.bash_profile → ~/.bashrc(由.bash_profile調用) → /etc/bashrc(由.bashrc調用)
# 登出:~/.bash_logout
# 2. 非交互式登錄 Shell (Non-Interactive Login Shell)
# 登錄:~/.bashrc -> /etc/bashrc(由.bashrc調用)
# 登出:不觸發任何登出邏輯
44、pkill使用中的一個小問題
腳本的執行方式不同:
1、絕對路徑或者相對路徑直接執行,如/opt/xxx.sh或者./xxx.sh等方式執行。
2、腳本作為解釋器參數的方式執行,如bash xxx.sh 或者sh xxx.sh或者/bin/bash xxx.sh等執行方式。
pkill命令默認只匹配command,而不匹配args。因此這種方式可能無法正確匹配到需要kill的進程。使用pkill -f可以匹配command and args(完整命令行),但增加了誤殺進程的風險。
45、: No such file or directory.sh
執行命令報錯:: No such file or directory.sh,這個錯誤信息很奇怪,通常的錯誤信息是 No such file or directory,這里前面有一個冒號,后面還跟了一個 .sh。
原因:當前shell環境中的alias定義錯誤,由于/etc/profile或/etc/profile.d/中的shell腳本是windows換行符(即shell中的alias命令行是windows換行符),加載alias出錯。使用tpye和alias命令排查。
46、普通用戶執行sudo bash -c 'ls'提示Permission denied
sudoers文件中配置如下:
user1 ALL=(ALL) NOEXEC:ALL
NOEXEC關鍵字用于限制用戶通過sudo執行指定命令時,禁止該命令內部調用其他可執行程序(即禁止創建子進程),防止權限逃逸。
因此,在執行sudo bash時,無法通過bash調用子進程(ls),因此報權限拒絕。通過sudo -i切換到終端同樣受限于sudoers文件配置(本質一樣)。
注意:noexec僅對通過sudo執行的外部命令有效(如/bin/ls、/usr/bin/less等),對bash內置命令(如cd、pwd等)無效(執行內置命令無需啟動新進程)。
47、四層代理不轉發
tcpdump抓取到了入口報文,但無轉發報文。沒有指向來源IP的路由,屬于反向路由過濾丟包。
內核默認會檢查數據包的源IP是否可達,即查詢源IP是否在路由表中存在回源路徑,如果存在,則所有數據包都允許通過(轉發或接收)。
內核參數為net.ipv4.conf.all.rp_filter,默認值為1。

浙公網安備 33010602011771號