1》內存子系統
1>組件:
slab allocator
buddy system
kswapd
pdflush
2>虛擬化環境:
PA:進程地址;
HA:虛擬機地址;
MA:機器地址;
虛擬機轉換:PA---->HA
GuestOS(來賓主機),OS(宿主主機);
Shadow PT:影子列表
3>Memory:
TLB:提升性能;
Hugetable page:
使用的文件系統:Hugetlbfs;
啟用hugepages:
1)修改/etc/sysctl.conf:
vm.nr_hugepages = n

2) Kernel parameter:
hugepages = n
2》創建hugepages從而被應用所使用(不必明確指定文件系統類型,應用要使用時會自動調用,一般MYSQL的緩存塊需要使用大頁面):


3》Strace看進程如何運行,執行了哪些系統調用:
1>strace -p PID ***查看啟動進程的系統調用;

2>strace 命令:查看命令的系統調用;

strace -c 命令:加入-c可以只輸出命令過程中的摘要信息;
-o:將追蹤結果保存至文件中,以供后續分析使用;
4》優化內存子系統的使用:
1>盡可能降低微小內存對象的開銷;
Slab cache:
2>降低或延遲慢速子系統的服務時間;
Filesystem metadata:buffer cache(slab cache)====>使用buffer cache緩存文件元數據;
Disk IO:page cache====>使用page cache來緩存DISK IO,加速讀操作;
Interprocess communications:shared memory====>使用共享內存來完成進程間通信;
Network IO:buffer cache,arp cache,connection ruacking====>使用buffer cache,arp cache和connection tracking提升網絡IO性能;
3>設置內存的最小空余KB;
4>注意避免內存過量使用:
物理內存的過量使用是以swap為前提的,可以超出物理內存一部分;

0:不回收dentries和inodes;
1-99:傾向於不回收;
100:傾向性與page cache和swap cache相同;
100+:傾向於回收;
內存溢出(OOM):當內核發現由於發生內存溢出而無法再使用時會強制殺死占用大量內存的進程;
5>調整網絡IO的ARP緩存(/proc/net/arp);
5》進程間通信相關內存的調優:
1>進程間通信類型:messages,semaphores,shared memory;

2>查看三者當前的限值:

3>進程間通信管理類命令:
ipcs:查看一些消息隊列;
ipcrm:刪除某些已經失去作用的消息隊列,釋放內存;
4>share memory 和messages的相關參數:
shm:
shmmni:系統級別,所允許使用的共享內存段上限;
shmall:系統級別,能夠為共享內存分配使用的最大頁面數;
shmmax:單個共享內存段的上限;
messages:
msgmnb:單個消息隊列的上限,單位為字節,默認是16384;
msgmni:系統級別,消息隊列個數上限;
msgmax:單個消息大小的上限,單位為字節;
5>手動清寫臟緩存和緩存,然后回收:
sync:
echo s > /proc/sysrq-trigger
回收:
echo 1 > /proc/sys/vm/drop_caches

1 to free pagecache
2 to free dentries and inodes
3 to free pagecache,dentries and inodes
6>Out-of-memory killer:
決定各個進程是否會被殺死的數值oom_score:
-16-15:幫助計算oom_score
-17:disables the oom_killer for that process
6》Swap相關:
1>哪些頁面會被swap:
非活動頁;
匿名頁;
Swap cache:可以有效的避免資源競爭;
2>如何提高swap的性能:
降低swap的think time,意味着我們使用小的swap分區;
降低訪問次數,盡量不要使用swap,增大物理內存,不行的話就增加多個swap分區;
降低服務時間;
7》監控內存使用相關命令:
sar -r:查看內存活動情況;
sar -R:內存變換速率;
sar -W:緩存空間活動情況;
sar -B:I/O使用情況,報告頁面換進換出;
