CentOS 6與CentOS 7 詳細對比:常見設定、服務管理、效能測試
本主題將從3個角度進行對比
2. 服務管理(Sysvinit vs Upstart vs Systemd)
3. 效能測試(cpu/mem/io/oltp)
環境說明
硬體
- 伺服器: Dell PowerEdge R620
- CPU: E5-2620 v2 @ 2.10GHz * 2
- MEM: 8G DDR3 1333 MHz * 4
- DISK: 300G SSD * 1
- BIOS: 預設
系統
- CentOS 6: CentOS 6.10 (2.6.32-754.el6.x86_64)
- CentOS 7: CentOS 7.5 (3.10.0-862.el7.x86_64)
一. 常見設定
1. 字符集
CentOS 6
- 方法: /etc/sysconfig/i18n
CentOS 7
- 方法1: localectl set-locale.utf8
- 方法2: /etc/locale.conf`中的LANG=
2. 主機名
CentOS 6
- 線上生效: hostname
- 重啟生效: /etc/sysconfig/network中的HOSTNAME=
CentOS 7
- 線上+重啟生效: hostnamectl set-hostname
3. 時區
CentOS 6
- 方法: ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
CentOS 7
- 方法1: 同CentOS 6
- 方法2: timedatectl set-timezone Asia/Shanghai
4. 時間同步
CentOS 6
- 逐步: ntpd或ntpdate
- 直接: ntpdate -b(通常加到crontab)
CentOS 7
- 方法1: systemctl start chronyd
- 方法2: timedatectl set-ntp yes(同systemctl start chronyd)
可以通過timedatectl | grep "NTP synchronized"判斷當前時間是否已同步
makestep 1.0 -1 ntpd和chronyd區別
5. 手動更改時間
CentOS 6
- 方法: date -s "2018-07-08 11:11:11"
CentOS 7
- 方法1: 同CentOS 6
- 方法2: timedatectl set-time "2018-07-08 11:11:12"(前提是timedatectl set-ntp false)
6. 單使用者修改密碼
CentOS 6: grub
介面鍵入 e
,在 kernel
行最後加 1
,鍵入 b
啟動進入單使用者模式,之後輸入 passwd
修改密碼
CentOS 7: grub
介面鍵入 e
,在 linux16
行上將 ro
改為 rw
,並在當前行最後加 init=/bin/sh
,鍵入 ctrl-x
進入,之後輸入 passwd
修改密碼
- 如果有開啟selinux,則需要在修改密碼後,重啟前,執行 touch/.autorelabel
- passwd執行後,最好執行sync,防止強制重啟導致修改密碼沒有落地
7. grub新增引數
CentOS 6:
-
/boot/grub/grub.conf的kernel中加入需要新增的引數
CentOS 7:
-
步驟1:/etc/default/grub的GRUBCMDLINELINUX中加入需要新增的引數
-
步驟2:grub2-mkconfig -o /boot/grub2/grub.cfg
8. 檢視開機記錄
CentOS 6: last
CentOS 7: journalctl --list-boots或last
9. 修改啟動核心
1.檢視當前啟動核心
- CentOS 6: cat /boot/grub/grub.conf中的default
- CentOS 7: grub2-editenv list
2.檢視有哪些核心
- CentOS 6: cat /boot/grub/grub.conf | sed -n '/^title/s/^title //p'
- CentOS 7: cat /boot/grub2/grub.cfg | grep '^menuentry' | awk -F"'" '{print $2}'
3.設定啟動核心
CentOS 6:
- 修改/boot/grub/grub.conf中的default
CentOS 7:
- 步驟1:確保/etc/default/grub中的 GRUB_DEFAULT為saved
- 步驟2:grub2-set-default 'CentOS Linux (3.10.0-693.el7.x86_64) 7 (Core)'
10. rc.local
執行順序
- CentOS 6: 序列的最後一個執行
- CentOS 7: 和其他服務並行執行
可執行許可權
- CentOS 6: 預設有可執行許可權
- CentOS 7: 預設沒有可執行許可權(官方不推薦使用rc.local),需要自行增加(chmod +x /etc/rc.d/rc.local)
CentOS 7的注意事項
- rc.local由rc-local.service執行,由於systemd服務是並行執行,僅能保證在network之後啟動,因此建議rc.local裡增加sleep 10來儘可能在最後執行
- 需要在rc.local的最後一行增加exit 0,否則可能導致已啟動的程序被關閉(echo 'exit 0' >> /etc/rc.d/rc.local)
- 建議儘量使用systemd來配置服務,不要使用rc.local
11. limit配置
CentOS 6:
- 全域性設定: 沒有全域性設定的方法(/etc/security/limits.conf僅針對使用pam的程序,且有載入pamlimits.so的模組,因為limits.conf是pamlimits.so的配置檔案)
- 服務設定: 只能在服務啟動前設定ulimit,才能在啟動後看到效果
CentOS 7:
- 全域性設定: /etc/systemd/system.conf裡DefaultLimitNOFILE=65535
- 服務設定: [Service]裡增加LimitNOFILE=65535
12. yum僅使用ipv4
CentOS 6: yum沒有自帶方法
CentOS 7: yum.conf裡增加ip_resolve=4
13. 徹底禁用ipv6
CentOS 6和CentOS 7相同
- 在grub上增加ipv6.disable=1
檢視是否徹底關閉
- sysctl -a | grep -i ipv6如果沒有任何輸出,則表示徹底關閉
14. 防火牆
CentOS 6
- 預設開啟iptables服務,只不過預設沒有條目
CentOS 7
- 預設安裝並開啟firewalld服務
- 預設不安裝iptables服務(yum install iptables-services)
15. NetworkManager
CentOS 6: 預設未安裝
CentOS 7: 預設安裝並啟動
16. 網絡卡名
CentOS 6:
- 系統安裝完,預設是em1開始,這其實是在裝機完成時在udev裡做的繫結
- 把/etc/udev/rules.d/70-persistent-net.rules內容清空,則恢復成eth0開始編號
CentOS 7:
- 不再通過udev繫結網絡卡名,預設是em1開始,有的是eno、enp、ens等名字
- 如果想恢復eth0,則/etc/default/grub裡增加net.ifnames=0 biosdevname=0
- 如果想讓CentOS 6的網絡卡名不受udev影響,達到CentOS 7的效果,則刪除3個檔案即可
rm -f /etc/udev/rules.d/70-persistent-net.rules
rm -f /lib/udev/write_net_rules
rm -f /lib/udev/rules.d/75-persistent-net-generator.rules
網絡卡名規則
- eno:主機板板載網絡卡
- enp:獨立網絡卡(PCI網絡卡)
- ens:熱插拔網絡卡(usb之類)
17. CPU頻率(performance)
CentOS 6
-
始終:2.1GHz
CentOS 7:
-
空閒:1.2GHz
-
sysbench 1執行緒壓測:一個物理cpu所有核的頻率瞬間增長,其中最高打到2.6GHz
-
sysbench 42執行緒壓測:所有cpu所有核的頻率全部達到2.4GHz
-
若要和6一樣保持頻率,則在/etc/default/grub裡增加intel_pstate=disable(不建議,因為效能沒有任何提升,還在某些情況下降)
二. 服務管理
1. sysvinit、upstart、systemd簡介
2. sysvinit、upstart、systemd常用命令
3. runlevel執行級別
4. 日誌查詢
CentOS 6: 手工在/var/log/messages、/var/log/dmesg、/var/log/secure中grep,麻煩且效率低
CentOS 7: 統一使用journalctl,可以使用多個因素匹配,比如時間段、服務名、日誌級別等等。另外,systemd日誌預設經過壓縮,是二進位制檔案,無法直接檢視
5. 實現守護程序
CentOS 6
-
sysvinit需要自行實現,如:
-
- nohup &
-
- screen
-
- supervisor
-
upstart和systemd類似,將程式執行在前臺即可
CentOS 7
-
由systemd啟動,將程式執行在前臺即可
6. sysvinit、upstart、systemd例子
sysvinit
cat > /etc/init.d/mytest <<EOF
. /etc/rc.d/init.d/functions
start() { … }
stop() { … }
restart() { … }
reload() { … }
status() { … }
case "$1" in
start)
start ;;
stop)
stop ;;
…
esac
exit $RETVAL
EOF
chmod +x /etc/init.d/mytest
service mytest start
upstart
cat > /etc/init/mytest.conf <<EOF
start on runlevel [3]
description “mytest"
exec /root/mytest.sh
EOF
initctl start mytest
systemd
cat > /usr/lib/systemd/system/mytest.service <<EOF
[Unit]
Description=mytest
[Service]
Type=simple
ExecStart=/root/mytest.sh
[Install]
WantedBy=multi-user.target
EOF
systemctl start mytest
7. PID管理
sysvinit: 需要生成PID檔案,用於後期關閉、重啟等使用
upstart: 無需PID檔案,upstart會記錄主程序ID,子程序ID沒有記錄
systemd: 無需PID檔案,所有程序ID由cgroup統一接管
8. 內建的資源限制
CentOS 6: 除了ulimit,沒有其他限制程序資源的簡便方法
CentOS 7: 除了ulimit,還支援部分cgroup限制,可對程序做記憶體限制和cpu資源限制等
[Service]
ExecStart=...
MemoryLimit=500M
CPUShares=100
另外,CentOS 7可以通過systemd-cgtop命令檢視cgroup裡的效能資料
9. 服務異常自動重啟
upstart
start on runlevel [3]
description "mytest"
exec /root/mytest.sh
post-stop exec sleep 5
respawn
respawn limit unlimited
systemd
[Unit]
Description=mytest
[Service]
Type=simple
ExecStart=/root/mytest.sh
Restart=always
RestartSec=5
StartLimitInterval=0
[Install]
WantedBy=multi-user.target
上面2種方式均表示,無限次自動重啟,每次重啟前等待5秒
10. 寫日誌方式
CentOS 6: 自行輸出到檔案中,或通過syslog記錄(如logger命令)
CentOS 7: 只要程式由systemd啟動,只需將輸出日誌到標準輸出或標準錯誤
-
建議centos7只將應用程式的一些元資訊輸出到標準輸出或標準錯誤,比如啟動成功、啟動失敗等等
-
不建議將業務日誌輸出到journal。因為journal中所有日誌都存在一個檔案中,會導致2個問題:
-
1. 如果沒有做日誌持久化,則預設存在記憶體中,會導致最多一半的記憶體被佔用
-
2. 儲存量很大,會導致查詢其他日誌很耗時
-
解決辦法:輸出到syslog,[Service]支援StandardOutput=syslog
11. 指定每條日誌級別
CentOS 6: 通過syslog將不同級別的日誌輸出到不同檔案
CentOS 7: 只需在輸出的每一行開頭加<日誌級別>,比如
echo '<0>hello, emerg'
echo '<1>hello, alert'
echo '<2>hello, crit'
echo '<3>hello, err'
echo '<4>hello, warning'
echo '<5>hello, notice'
echo '<6>hello, info'
echo '<7>hello, debug'
12. systemd日誌永久儲存
systemd日誌預設儲存在記憶體中,因此當伺服器重啟後,就無法通過journalctl來檢視之前的日誌,解決方法:
mkdir -p /var/log/journal
systemctl restart systemd-journald
三. 效能對比
1. CPU測試
工具: 通過sysbench對cpu進行壓力測試
引數設定
-
素數: 10000
-
測試時間: 900秒
-
執行緒數: 1、6、12、18、24、30、36、42
分別測試使用睿頻和不實用睿頻
> 圖1: cpu測試 - 每秒events
如何看圖:越高越好
此圖結論:
-
cpu效能基本一致
-
CentOS 7固定頻率(不使用睿頻),並沒有提升效能,因此沒有關閉睿頻的必要
> 圖2: cpu測試 - event數量標準差
如何看圖:越少越好
此圖結論:
-
通過標準差可以看出在穩定性方面,CentOS 7要穩定很多(包括不使用睿頻)
2. 記憶體測試
工具: 通過sysbench對記憶體進行壓力測試
引數設定
-
讀寫方式: 隨機
-
測試時間: 900秒
-
分別測試讀和寫
-
塊大小: 4K、16K、2M
-
執行緒數: 1、12、24、36、48
> 圖1: 記憶體測試 - 速率
如何看圖:越高越好
此圖結論:
-
CentOS 6和CentOS 7效能一致
> 圖2: 記憶體測試 - event數量標準差
如何看圖:越少越好
此圖結論:
-
通過標準差可以看出在穩定性方面,CentOS 7要穩定很多
3. IO測試
工具: 通過fio對io進行壓力測試
引數設定
- ioengine: libaio
- iodepth: 16
- 測試時間: 900秒
- 檔案大小: 100G
- 執行方式: 執行緒
- 快取方式: 無快取(non-buffered I/O)
- 讀寫方式: 隨機讀寫
- 塊大小: 分別測試4K和16K
- 執行緒數: 1、12、24、36、48
> 圖1: io測試 - iops
如何看圖:越高越好
此圖結論:
- CentOS 6(預設ext4)不如CentOS 7(預設xfs)
- CentOS 6(預設ext4)不如CentOS 6(xfs)
> 圖2: io測試 - 讀寫平均延時
如何看圖:越少越好
此圖結論:
- CentOS 7的寫延時和CentOS 6(預設ext4)接近
- CentOS 7的讀延時比CentOS 6(預設ext4)好很多
4. OLTP測試
工具: 通過tpcc-mysql對整機效能進行測試
引數設定
- 檔案系統: 均為xfs
- mysql版本: mysql-8.0.12
- tpccload:
- warehouse: 100
- sql: createtable.sql、addfkeyidx.sql
- 執行時長: 沒有限制,跑完將近1小時
- tpcc_start:
- warehouse: 100
- warmup: 300秒
- 執行時長: 1800秒
- 執行緒數: 16、32、64、128、256、512、1024
> 圖: oltp測試 - tpmc
如何看圖:越高越好
此圖結論:
- CentOS 7比CentOS 6(預設ext4)高
5. 總結
總結:7個測試結果中,只有2項是基本一致,其餘5項均是CentOS 7勝利,因此基本可以得出結論,CentOS 7效能比CentOS 6更好!