RHCA rh442 006 中断号 缓存命中率 内存概念 大页
IRQ均衡 硬中断
IRQ是中断号
2003
电脑 拨号 56K Modem
USB 打印机
拨号成功,打印机会是乱码,他们会不兼容
因为终端号一样 (类似ip地址冲突)
在bios里面调整设备的中断号
如今设备bios在初始化时,就会分配设备中断号
由bios统一管理 (类似DHCP)
vnet2: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet6 fe80::fc54:ff:fe00:fafe prefixlen 64 scopeid 0x20<link>
ether fe:54:00:00:fa:fe txqueuelen 1000 (Ethernet)
RX packets 119 bytes 10400 (10.1 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 459 bytes 29832 (29.1 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
每增加一个虚拟机(kvm)就会增加一个类似这样的虚拟网卡
windows pc 一个网络适配器可以增加多个网段
[root@servera ~]# cd /proc/irq/
[root@servera irq]#
[root@servera irq]# ls
0 10 12 14 16 21 25 27 29 30 32 34 36 38 4 41 43 45 47 49 6 8 default_smp_affinity
1 11 13 15 2 24 26 28 3 31 33 35 37 39 40 42 44 46 48 5 7 9
[root@servera irq]#
查看中断号
实例
watch -n 1 'cat /proc/interrupts | grep eno16'
查看网卡的中断号,可以发现cpu1在活动(我在宿主机里ping当前虚拟机)
网卡绑核心
进程绑核心
当流量很大,网卡对cpu消耗会增大,把网卡绑在特定cpu上
网卡绑核 (rhel7)
更改流量在哪个网卡上工作
中断号是不变的
echo f > smp_affinity
也可以在前四个上面跑
这个绑了核不会变
rhel8
Every 1.0s: cat /proc/interrupts | grep rxtx foundation0.ilt.example.com: Sun Jul 3 12:33:40 2022
57: 0 3 0 48 164 78 IR-PCI-MSI 1572864-edge ens160-rxtx-0
58: 8 0 15 5 0 0 IR-PCI-MSI 1572865-edge ens160-rxtx-1
59: 0 4 0 0 0 0 IR-PCI-MSI 1572866-edge ens160-rxtx-2
60: 0 0 5 0 0 0 IR-PCI-MSI 1572867-edge ens160-rxtx-3
62: 0 0 221 0 120 1112 IR-PCI-MSI 5767168-edge ens192-rxtx-0
63: 15 28 72 6 2 17 IR-PCI-MSI 5767169-edge ens192-rxtx-1
64: 4 674 0 0 0 0 IR-PCI-MSI 5767170-edge ens192-rxtx-2
65: 8 4 0 286 0 122 IR-PCI-MSI 5767171-edge ens192-rxtx-3
他们是linux物理网卡 ens160-rxtx-0 ens192-rxtx-0 其他为linux虚拟网卡
红帽8你设置了smp_affinity他也会变
proc/irq
[root@192 56]# cat effective_affinity
00000000,00000000,00000000,00000008
[root@192 56]# cat effective_affinity
00000000,00000000,00000000,00000004
[root@192 56]#
你无法绑核,他自动变,很均衡
红帽8,他很智能,他自动会均衡
每10秒变一次
结果,也可以提升缓存命中率
[root@192 56]# systemctl stop irqbalance.service
将均衡服务关掉,终极提高缓存命中率,但是完全不负载均衡,这是极端
网卡与cpu绑定,提升网卡缓存命中率 (最好是指定网卡绑在多几个核上,到处跳也不是很好)
频繁的跳,不仅消耗cpu资源,也会使缓存命中率变低
红帽8关闭均衡
为什么要绑核
缓存命中率
在开始工作前,数据必须放在cpu缓存中
当处理一个数据时,数据必须被调用到cpu缓存中才能被执行
内存不处理数据,只做数据暂存,随机存储器
cpu处理数据
1,2,3(缓存) 内存 硬盘
从内存中调度到缓存中,把它记录下来,如果下次还要调度数据,就直接从缓存中读取
inter L1 32K + 32K = 64K
L2 256K
L3 12M 24M
cache-hit 命中率 运行一个应用程序在缓存中的比率
cache-miss 丢失率 反之,如果不在缓存中为丢失率 (低效率)
每个核缓存内容不一样的,所以进程和网卡中断绑核
如果在程序运行时,没有绑核,他会均衡运行在多个核上。当他第一次运行时,没命中,就丢失,读了之后填充回来。填充到缓存snoop,如果运行在第二个核上,第一个核复制过来的东西。就被缓存命中了,因为第一个核复制了缓存到第二个核
下次进程再运行,两个缓存都有了!
缓存极大提升效率(命中后),但是他非常小,很容易被下一个进程填充
依赖缓存的话,就得运行在特定到几个核上。 减少开销和数据轮换
数据在缓存中改变,还需从缓存读到内存中
缓存中改变,立马写到内存。实时看到变化,开销较多 write-through 透写
当我(缓存)被覆盖时,才开始写 write-back 回写
测试
cache-a
cache-b
time cache-a
time cache-b
测时间
同样的结果不同的写法,哪一个更快?更优秀?
有些写法会更能利用缓存
valgrind --tool=cachegrind ./cache-a
valgrind --tool=cachegrind ./cache-b
通过命令可以知道谁的缓存命中率高,
也可以直接从速度的方面被感知出来
valgrind打印的值
miss rate 丢失率
绑核提升缓存命中率也能提升运行效率,但是会负载过高
利用缓存利用率可以大大提升性能
好好写代码可以利用缓存,绑核也可以利用缓存。别把代码瞎写。也别让cpu在100个内核里乱跳
lab cputuning-cpucache start
内存管理
内存地址和分配
1.虚拟内存
每个应用程序都会申请一段连续的,线性的地址空间
实际上并不连续
在物理内存看来,虚拟内存就是拆东墙补西墙
看上去像要多少给多少
实际上,用多少给你多少,精简模式 200G--10G。并不是你要多少有多少
虚拟地址空间范围 32bit windows XP 2^32 = 4GB
2^64 = 16EB
MMU 内存管理单元 memory management unit
MMU在cpu里,他负责虚拟内存与物理内存的映射
cat /proc/cpuinfo
address sizes : 45 bits physical, 48 bits virtual
目前来说我们只用到了2^48 = 256TB 内存空间
2^48 ~ 2^63 未开发
如今可以满足256TB的寻址,但没有程序要这么多
内存随时在用,内存随时回收
2.物理内存
物理页是真实的内存,他不连续
RAM+SWAP 构成
真正的内存 加上swap中转一下,不至于死机
block size 磁盘最小空间
page size 页大小 最小单位
------------------------------
[root@servera ~]# getconf -a | grep -i pagesize
PAGESIZE 4096
一个内存页4kb x86
ARM 64kb
[root@foundation0 ~]# pmap 42594
42594: /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf
000055d9387f7000 160K r-x-- vsftpd
000055d938a1e000 4K r---- vsftpd
000055d938a1f000 4K rw--- vsftpd
000055d938a20000 8K rw--- [ anon ]
000055d939fed000 132K rw--- [ anon ]
00007f7c90414000 20K r-x-- libcap-ng.so.0.0.0
00007f7c90419000 2044K ----- libcap-ng.so.0.0.0
00007f7c90618000 4K r---- libcap-ng.so.0.0.0
00007f7c90619000 4K rw--- libcap-ng.so.0.0.0
00007f7c9061a000 120K r-x-- libaudit.so.1.0.0
00007f7c90638000 2048K ----- libaudit.so.1.0.0
00007f7c90838000 4K r---- libaudit.so.1.0.0
00007f7c90839000 4K rw--- libaudit.so.1.0.0
00007f7c9083a000 40K rw--- [ anon ]
00007f7c90844000 108K r-x-- libpthread-2.28.so
00007f7c9085f000 2044K ----- libpthread-2.28.so
全是4的倍数
这些动态链接库,也是要消耗内存的
虚拟地址和真实的物理内存的映射,需要一个表来记录
32bit 4G 3.2G可用
被保留出来的给内核用
剩下的内存被保留,用来被保留出来的1G,其中1G之中有128M用来做页表
kernel通过页表转换虚拟地址到物理地址
1G中的1M给bios和io设备
1G的16M给DMA 直接内存映射
直接分配内存,不需要地址转换
16M给设备用的(内核模块之类,反正不是应用程序)
内核的功能都是由DMA直接提供内存
64bit 256TB虚拟地址 128TB用于内核 128TB用于应用程序
很少出现内存溢出,所有的内存都是活动状态
除非你把User space用完才可能出现溢出(没话说)
某一个区域的内存用完,也会产生内存溢出
16Mdma用完 表的128M用完都属于内存溢出 不像32那么紧缺。解决区域性内存
当一个应用程序启动时,CPU MMU会将虚拟内存物理内存映射 存在 page table PTE 页表条目
当应用程序关闭时,这个映射关系也随之结束
如果再次运行,又需要再次映射,这会消耗cpu资源
大页
大页的存在就是为了缓存一下 映射表信息。你关闭了进程后对应的映射表信息,随之关闭。你再开启那个程序,又得映射出来。这就需要大页给你缓存一下。降低cpu开销(cpu就不用那么忙,因为有大页缓存)
如果该系统瓶颈在cpu上,则牺牲内存资源来降低cpu开销,否则不需要
TLB:大页缓存: 给PTE条目充当缓存用 ,给映射关系提供缓存。大页是一段连续的物理内存,不可释放
hugepage 大页 一个大页 2048 kB
启用大页。来降低cpu开销
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
Hugetlb: 0 kB
DirectMap4k: 374592 kB
DirectMap2M: 10110976 kB
DirectMap1G: 8388608 kB
[root@foundation0 ~]# cat /proc/meminfo
[root@foundation0 ~]# free -m
total used free shared buff/cache available
Mem: 16014 5572 7456 41 2985 10071
Swap: 8071 0 8071
[root@foundation0 ~]#
[root@foundation0 ~]# sysctl -a | grep hugepage
vm.nr_hugepages = 0
vm.nr_hugepages_mempolicy = 0
vm.nr_overcommit_hugepages = 0
[root@foundation0 ~]#
[root@foundation0 ~]# tail -n 1 /etc/sysctl.conf
vm.nr_hugepages = 200
[root@foundation0 ~]# sysctl -p
vm.nr_hugepages = 200
[root@foundation0 ~]# free -m
total used free shared buff/cache available
Mem: 16014 5972 7052 41 2989 9671
Swap: 8071 0 8071
[root@foundation0 ~]#
5572变成5972
SAWP 物理内存 (硬盘划分出一段空间)
当物理内存(主板实际内存紧张时,会将内存中暂时不用的程序丢到swap中存放,如果再次调用该程序时,会从swap中再次调用到内存中运行)
打开10个word文件,每个100M,需要1G内存,但我目前值编辑其中一个WORD文件,则其他9个可以放到SWAP中,前提是内存紧张
如果没有swap,当内存紧张时,你又运行了一个新的应用程序,则系统内存溢出。死机
对于应用程序来说swap就是物理内存,对于看的见摸得着的内存条来说,swap就是虚拟内存
紧张就是一下子,解决紧张时间。临时暂存。提升可靠性
有关容器
让容器关闭swap,让容器尽量不去用swap,去使用真实内存
--memory-swappiness 0 有swap也不用 如果你用swap,容器认为你资源很充足,他就把容器运行在上面。我给你关了swap就说明这上面没有内存,你运行在其他上面