linux系統優化


 

系統調優

L = A(到達率) * W(服務總時間)
L越低越好,W越低越好

 

AWK簡單使用:

1.awk -F: '{print $1}' /path 以‘:’為分隔符打印第一列數據
2.df -P | awk '{print $1 " is mounted on " $NF}' 單獨輸入設備掛載目錄
3.awk -F: 'BEGIN{print "any_string"} {print $1} END{print "any_str"} ' /path 第一行any_string 最后一any_str
處理文本的時候,可以在開始前結束前做加工處理
4.awk -F: '/regix/ {print $1} ' /etc/passwd 正則字符串匹配
5. sar -q | awk '/^[^a-z]+$/ {print $1,$2,$3}' 只輸出非字母開頭的行首行尾的行 統計負載
6. sar -b -s 開始時間 -e 結束時間 | awk '{print $1,$5+$6}' 顯示系統輸入輸出塊大小
gnuplot制圖工具使用:
yum install -y gnuplot
set xdata time 指定X軸為時間
set timefmt "%H:%M:%S" 指定時間格式
plot "/data/path" using 1:2 with lines 指定數據文件路徑,使用那兩列數據制圖,點和點之間用線連接
plot "/data/path" using 1:2 title "1 min" with lines,"/data/path" using 1:3 title "5 min" with lines,"/data/path" using 1:4 title "15 min" with lines
多條數據線
自動執行制定換圖腳本
vim xxx.gnuplot
xxx同上
:x
運行: gnuplot -persist ~/cpu.gnuplot -persist結果持續存在屏幕上
將數據結果以圖片的方式輸出到apache目錄下
set xdata time 指定X軸為時間
set timefmt "%H:%M:%S" 指定時間格式
set term png size 1024,768
set output "/var/www/html/stat/`data +%F`.png"
set "/data/path" using 1:2 with lines
做計划任務-》 crontab
crontab -e
0 80 * * * sar -b -s 17:00:00 -e 19:30:00 | awk '{print $1,($5+$6)/2}' > xxx.data;gnuplot dinner.gnuplot

 

查看系統狀態命令:

sar
vmstat
mpstat
iostat
time COMMAND
iotop
top
uname -r 內核
sysctl -a | grep agurment
lscpu CPU alive
/etc/device/system/cpux/on-line

 


用戶登錄日志:

last
lastlog
lastb


IO磁盤調度算法:

系統主配置文件路徑:
/sys/block/sda/queue/scheduler
算法調度參數:
/sys/block/sda/queue/iosched/*
更改磁盤調度算法:
cp xxx > /sys/block/sda/queue/scheduler
tuned使用:
tuned-adm list
tuned-adm active
tuned-adm profile <mode_name>
主配置文件/etc/tune-profiles/
cat /etc/tune-profiles/
mode:
default 電子郵件服務器,對服務器影響較小
desktop-powersave 面向桌面計算機,省電模式,對磁盤sata,cpu,網卡
server-powersave 面向服務器,省電模式
laptop-ac-powersave 筆記本充電時的省電模式
laptop-battery-powersave 筆記本無充電時,高省電,耐耗模式
throughput-performance 高性能 磁盤調度算法 readline
latency-performance 高性能
enterprise-profile-storage 高性能


應用進程優先級:

PR: RT,-99 - 39
NI: -20 - 19
實時:(編程時調用特定函數就能實現)
SCHED_RR 輪詢
SCHED_FIFO 隊列(只要沒有進程優先級高與正在執行的進程,正在執行進程不會被打斷)
非實時:
SCHED_NORMAL
SCHED_BATCH 大量數據操作,盡量不會被影響
SCHED_IDLE 系統空間時,才執行進程
如果編程中沒有實現實時,可以使用chrt改變進程執行模式:
chrt -f 10 COMMAND 測試:chrt -f md5sum /dev/zero
chrt -r 1 COMMAND 平分CPU
進程調度算法:
CFS Scheduler
引入虛擬時間:Vittual time(值高者優先執行)
Waiting time
No of needed processes
Process priority


緩存查看

x86info -c
查看命令緩存命中率:
valgrind --tool=cachegrind COMMAND
refs 指令緩存
真機查看緩存命中率:
perf stat -e cache-misses COMMAND

 


pam_limits 限制用戶使用資源,必須是用戶身份(不能限制IO)
用戶配置文件目錄
/etc/pam.d/fingerprint-auth-ac
limits主配置文件
/etc/security/limits.conf
limits子配置文件目錄
/etc/security/limits.d/
用戶查看自身資源限制
ulimit -a
限制用戶資源
student hard cpu 1(min) 寫在主配置或者子配置文件中都可行
admin soft cpu 5
500(pid):(大於等於) soft cpu 1

限制用戶進程內存,只能限制它的虛存VIRT(virtual address)
student hard as 262144(KB)
限制用戶進程數
* soft nproc 1024 (max user processes)軟限制
student hard nproc 1024
測試命令:boom(){ boom|boom& };boom OR :(){ :|:& };:
cgroup限制CPU,Memory,disk,network
yum install -y libcgroup
主配置文件
/etc/cgconfig.conf
合拼某兩項資源則將他們的目錄改成一個,注釋原先的目錄
cpu = /cgroup/cpumen
memory = /cgroup/cpumen
執行腳本:
/etc/init.d/cgconfig start
只要運行cgroup,/下會自動創建一個/cgroup/的目錄
lssubsys -m 掛載子系統
自定義group組
vim /etc/cgconfig.conf
group cname{
cpu{
cpu.shares=100(1024代表100%的使用權)
}
}
vim /etc/cgconfig.conf
group poormen{
memory{
memory.limit_in_bytes=268435456(256M未來進程使用的物理內存大小)
memory.memsw.limit_in_bytes=268435456(256M,當內存使用完時,內存+swap空間,swap大小=下-上)
}
}
vim /etc/cgconfig.conf
group io{
blkio{
blkio.weight=100;(需要CFQ梯度算法支持)
blkio.throttle.read_bps_device=(8:0 1000000) 讀磁盤最大1Mbps,需要查看磁盤主號從號 ll /dev/sda
}
}
vim /etc/cgconfig.conf
group stopit{
freezer{

}
}
利用cgexec可將進程綁定到預先定義好的CGROUP組
測試:cgexec -g cpu:cname time dd if=/dev/zero of=/dev/null bs=1M count=200000
測試:內存
新建一個內存盤
mkdir /mnt/tmpfs
mount -t tmpfs none /mnt/tmpfs 對該目錄操作等於直接操作內存
命令:
cgexec -g memory:poormen dd if=/dev/zero of=/mnt/tmpfs bs=1M count =
測試:IO測試前要把緩存丟棄不然不公平 echo 3 > /proc/sys/vm/drop_caches
命令:
cgexec -g blkio:low time cat /bigfile1 > /dev/null
cgexec -g blkio:hig time cat /bigfile2 > /dev/null
測試:
echo pid > /cgroup/freezer/stopit/tasks
echo FROZEN > /cgroup/freezer/stopit/freezer.state 冷凍
echo THAWED > /cgroup/freezer/stopit/freezer.state 解凍
編輯文件限制用戶進程,綁定cgroup
vim /etc/cgrules.conf
student:dd blkio io/

cgroup實現2顆CPU,一顆用於系統,一顆專門執行某命令
isolate 對用戶屏蔽CPU,但不能屏蔽baseCPU
isolcpus=1(CPU list:0,1,2,3... )
某CPU免疫interrupts中斷 vim /etc/sysconfig/irqbalance
IRQ_AFFINITY_MASK=2(cpu list:1,2,4,8...6=cpu 2+cpu 3 )

vim /etc/cgconfig.conf
group 2ndcpu{
cpuset{
cpuset.cpus=1;(cpu list:0,1,2,3...)
cpuset.mems=0;
}
}



指定當前虛擬機使用哪顆CPU
查詢:
virsh dumpxml vmname | grep cpu
watch -n1 virsh vcpuinfo vmname
分配:
echo 1 > /cgroup/cpuset/libvirt/qemu/vmname/cpuset.cpus

strace displays 跟蹤 kernel space
只要執行命令有system call那么就會被追蹤出來
example:function -> open()
demo:
strace updatedb
strace -e strace=network COMMAND
strace -e stracr=file COMMAND
strace -p pid 跟蹤進程
strace -c COMMAND 對命令進行統計所有的系統調用
strace -f COMMAND 跟蹤所有子進程
參數:(絕大多少的命令都要調用glibc庫)
open打開動態鏈接庫
mmap將命令鏡像到內存中
socket建立socket連接
open("/lib64/libresolv.so.2") DNS查詢的動態庫
sendto 發包
recvfrom 收包
read 讀包

ltrace displays 跟蹤 kernel space
example:function -> fopen()
主要跟蹤glibc庫的函數調用
demo:同上

systemtap 追蹤應用程序和kernel行為
使用了kprobes子系統來進行監控
開發systemtap環境
依賴包:
kernel-debuginfo
kernel-debuginfo-common
kernel-devel
systemtap
gcc
執行自編systemtap腳本(包括編譯、解析、添加至內核運行)
stap -v scriptname.stap kernel中可立即看到效果
留下kernel模塊,給生產環境使用
stap -v -p4 -m modulename scriptname.stap

生產環境:
依賴包:
systemtap-runtime
添加systemtap模塊至內核
staprun modulename.ko
權限管理:
后門,普通用戶如果在stapusr group 中,就可以進入運行/lib/kernel/2.4-/systemtap/*.ko

防止在stapusr組中的普通用戶執行不安全的內核模塊
root:
cp *.ko /lib/kernel/2.4.-/systemrap/
普通用戶只能添加目錄里的安全的內核模塊
如果把用戶添加至stapdev 開發組里,那么該用戶可以在任何地方添加.ko文件至內核




內存管理:

x86 指令集 上,內存分頁,每頁的大小為4KB
物理內存和虛擬內存
程序首先要申請虛擬內存,x86有16E幾乎沒限制,但內核並不是立刻就全部分配,而是
程序使用多少才分配多少
程序只能看到虛擬內存,並且是連續的。但是虛擬內存轉換為物理內存時,可能不是連續的。父進程同一時間可能和多個子進程使用同一個內存頁
virtual address to physical address translations are stored in page table
頁表也占內存,犧牲了部分內存管理
進程要訪問真實的物理內存中的數據要進程page walk,x86有4層結構,層層遞歸查詢到頁表,最后才指向頁幀(物理內存)
程序訪問物理內存首先會查找CPU中的TLB,TLB存儲虛擬內存到物理內存的鏡像關系,
TLB-Translation look-aside buffer
first check TLB
if TLB hit,return address
else page walk , cache address mapping
x86 平台提供大內存頁hug,解決大內存進程使用大量page時,需要大量的page table表項描述導致內存浪費。有2Mpage、4Mpage

內存huge page的使用
huge page是連續的內存段,不是由page合成的,是獨立內存區域
一般在開機的時候分配大頁,那時候內存很干凈,連續段很多
vim /etc/sysctl.conf
vm.nr_hugepages = 10
臨時分配內存:
sysctl vm.nr_hugepages = 10

查看內存大頁:
grep Huge /proc/meminfo

To use huge page
1.創建偽文件系統hugetlbfs:
mount -t hugetlbfs none /mountpoint
Application use mmap system call on /mountpoint
2.使用共享內存:
Application use shmget and shmat system calls
3.RHEL6.2 引入透明huge page使用
THP自動拼裝huge page
khugepaged 自動將普通也切換成大頁
THP工作在匿名內存(進程動態使用的內存頁)

 

Memory Allocation
1.process forks or execs child process
child process uses parent process'page frames unitl a write access is made
this is referred to as copy write(COW)
2.new process requests memory
kernel commits additional virtual address space to process
3.new process uses memory
tiggers a page fault exception
minor:kernel allocates a new page frame with help from MMU
major:kernel blocks process while page is retrieved from disk
4.process frees memory
kernel reclaims pages

Swap space:
swap space 'increases' the amount of memory
pages not being used can be paged out to disk,therefore more free memory to use
vmstat:
觀察swap的si so值,如果很大說明交換空間不停的被使用,產生的代價很沉重
交換空間大小配置:
system memory -> minimum swap space
4GB 2GB
4-16GB 4GB
16-24GB 8GB
64-256GB 16GB


Buffer Cache:
it (Slab cache防止內存碎片)used to cache file system meta data(dentries and inodes)
與文件內容無關的數據都可以歸到Buffer cache


Page Cache:
it used to cache file system block data(file content)
它是文件內容數據,不能交換回磁盤


丟棄緩存:
echo 1 > /proc/sys/vm/drop_caches
-1 block data
-2 meta data
-3 block and meta data


交換可調參數:
/proc/sys/vm/swappiness
swap_tendency = mapped_ratio / 2 + distress + vm_swappiness
mapped_ration is the % of physical memory in use
distress is how hard kernel try to free memory
vm_swappiness is what we can tune
值調小:
內核盡量交換page cache
例子:web server Email,交互式的
swap_tendency < 100
值調大:
內核盡量交換匿名內存和共享內存
例子:非交互式的,業務流量內存大時,盡量不干擾page cache
swap_tendency >=100
默認添加掛載交換分區時,如果沒有調節優先級參數,當前掛載交換分區會比之前掛載的分區優先級低一點
性能提高點:只要交換分區的優先級相同那么,內核回輪詢使用交換分區

內存頁狀態:
Free:可分配的內存頁
Inactive Clean:page cache OR buffer cache,隨時可以被系統回收
Inactive Dirty:程序修改的內存數據,但還未被存盤
Active:內存頁被程序使用
如何處理Inactive Dirty,臟頁回收,未處理memory page,提高內存空間

每次磁盤設備默認有個,per-BDI Flush Threads
針對內存臟數據可調參數:
vm.dirty_expire_centisecs (臟數據滯后,滿足最小時間限制,合並寫操作)
vm.dirty_writeback_centisecs (固定時間間隔喚醒per-BDI刷新線程處理臟頁數據)
vm.dirty_background_ratio (系統內存有10%都是臟數據)
vm.dirty_ratio (系統內存有40%都是臟數據時,掛起所有寫操作,把臟數據同步到磁盤)

OOM:kernel承諾內存過大,不能兌現諾言給程序
kernel解決辦法:
隨機殺死一些進程,會導致系統會不穩定
自主解決辦法:
sysctl -a | grep vm.panic_on_oom
vm.panic_on_oom 設置為1,內存不能兌現時,系統掛起,無數據交互了


x86_64 物理內存架構(64位):
低16M留給ZONE_DMA
4G留給ZONE_DMA32
其他留給ZONE_NORMAL(基本無限大) 內存運行在ZONE_NORMAL中
x86_64 物理內存架構(32位)
低16M留給ZONE_DMA
880M留給ZONE_NORMAL
其他留給ZONE_HIGHMMEM


Memory Overcommit
0:智能判斷分配
1:不做判斷
2:超過真實內存大小,絕對不會分配(真實大小=swap+物理內存50%)
sysctl vm.overcommit_memory = 2 (安全)
如果想把全部的物理內存也加上,那么需要修改
vm.overcommit_ratio = 100
測試:bigmem -v 2000(默認單位Mib)
超出承諾值最大:
grep Comm /proc/meminfo
只要不超越這個限制程序還是能正常運行的

 

 

進程間通信手段:SysV IPC標准
Semaphores 信號量
max number of arrays 允許多少信號量數組個數
max semaphores per array 運行一個程序信號量中存在信號令數組大小
max semaphores system wide 運行總共的信號量個數
max ops per semop call 每個信號量最多發出的system call
sysctl -a | grep kernel.sem
Message queues 消息隊列
default max size of queue (bytes) 一個消息隊列運行存在多少字節的數據
max size of message (bytes) 一個消息最大長度,可以把一個消息隊列占滿
max queues system wide 消息隊列在系統中的個數,可能是隨機的
sysctl -a | grep kernel.msg
Shared memory 共享內存(使用最多)
max number of segments 系統運行的共享內存個數
max seg size (kbytes) 最多共享內存段限制
max total shared memory (kbytes) 全局共享內存段總限制
sysctl -a | grep kernel.shm

ipcs命令查看使用情況
ipcs
進程間通信限制
ipcs -l

 

文件系統介紹
服務器級別使用的文件系統:ext3,ext4,xfs,btrfs(高效,性能強)(Oracle 開源的文件系統)
用戶桌面級別的文件系統:ntfs,fat16,fat32,fat64
ext3優勢:使用人數多,兼容性好
ext3劣勢:fsck文件系統做例行檢查非常慢,文件系統最多支持16TB大小
ext4優勢:超大文件系統幾百T,Extent大大縮小page頁面描述,相對於ext3效率提高10倍,寫操作滯后存盤,支持更大的文件系統
ext4劣勢:Extent使用之后不和低版本兼容,紅帽rhel6最多支持16TB大小文件系統
xfs優勢:大文件系統,高效率存儲
xfs劣勢:大量小文件,碎片文件處理效率低
BTRFS優勢:自帶raid,快照功能,對數據有效性很高,保護性完整性高
BTRFS劣勢:不適合生產
大文件系統效率高到低:BTRFS,XFS,EXT4,EXT3
大量小文件系統效率高到低:BTRFS,EXT4,XFS,EXT3
文件系統修復效率高到低:(EXT4,XFS),BTRFS,EXT3
寫操作效率:(EXT4,XFS,BTRFS),EXT3
超大文件寫操作:(EXT4,XFS,BTRFS),EXT3

 


文件系統日志調優(提高a到達率)
目的:讓文件系統修復速度加快,避免全盤搜索,保證文件系統的穩定性
模式:
ordered
記錄每一步寫操作的前后狀態
writeback
只記錄寫操作,不記錄是否寫完成
journal
文件的源數據和內容數據先寫日志區,2次寫代價太高(1.對文件系統的要求100%,不允許數據丟失2.面臨大量小文件往磁盤寫)

新建文件系統,指定外部日志功能:
mkfs.ext4 -O journal_dec -b 4096(block size) /dev/vdb1 其他文件系統的日志文件系統
mkfs.ext4 -J(journal) device=/dev/vdb1 -b 4096 /dev/vda3
tune2fs -l /dev/vda1 文件系統詳細信息

對於已經存在的文件系統,指定外部日志:
tune2fs - l /dev/vda1 確認block size
mkfs.ext4 -O journal_dec -b 4096 /dev/vdb2 新建外部日志分區
把需要的修改的文件系統umount下線:
umount /dev/sda1
tune2fs -O '^has_journal' /dev/sda1 把原來的日志功能關閉
tune2fs -j -J device=/dev/vdb2 /dev/sda1 重新指定日志分區
mount /dev/vda1 重新掛載使用

 

 

網絡負載平衡
yum install -y qperf
兩台主機都運行qperf,查看主機基本信息
主機1:qperf
主機2:qperf hostname conf
查看主機網卡速率:
qperf host tcp_bw tcp_lat udp_bw udp_lat

查看不同包大小的網卡速率:
qperf -oo msg_size:1:32k:*2 [-v] host tcp_bw tcp_lat udp_bw udp_lat

可調節參數(系統自動調節)Maximum Buffers:
net.ipv4.tcp.mem
net.ipv4.udp.mem
min pressure max
只有當TCP連接內存占到pressure值時,內核才干預TCP占用內存
如果這個服務器只做網絡工作,那么可以修改buffer的min值到四分之三
socket buffer for core networking,include UDP connection:
net.core.rmem_default
net.core.wmem_default
net.core.rmem_max
net.core.wmem_max
這些參數值再小也不會小於:
net.ipv4.udp.rmem_min
net.ipv4.upd.wmen_min

Then tune buffers of TCP specific networking:
net.ipv4.tcp_rmem
net.ipv4.tcp_wmem
min default max
min:minimum receive/send buffer for a TCP connection
default:default buffer size,一般最大的一半
BDP : buffer size = bandwith/8 * delay time (byte)
demo example:
tc qdisc show
模擬2S延遲發包:
tc qdisc add dev eth0 root netem delay 2s
tc qdisc show
另一台機子部署web服務,主機wget服務器的文件

網卡綁定提升帶寬:
balance-rr輪詢模式:既可以提升容錯率,還可以提升網卡帶寬速率
active-backup熱備:只有一塊工作
802.3ad動態鏈接協商:

修改MTU值,支持Jumbo Frames,所有的網絡設備都必須支持大幀:
每個以太網幀最大限制不局限於1500Byte,對於大數據量的傳輸時可以大大減小開銷
主機只需要修改網卡參數:
vim /etc/syscocnfig/network-script/ifcf-eth0
MTU=9000
網絡設備來說就需要修改硬件參數
一般來說過路由就沒有意義了





免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM