本例是按8GB物理内存大小分配内存的.
注意启用大页后在VMWare上启动和运行超慢.
在开始之间请先安装大页工具
sudo apt-get -y install libhugetlbfs-bin
创建用户postgres(所有机器)
#创建linux postgres用户组
#sudo groupadd pg
#查看用户组
#cat
#删除用户组
#sudo groupdel pg
#创建linux postgres用户,在home中创建用户目录
#sudo useradd postgres -m -g pg
sudo useradd postgres -m
#指定用户登陆时使用的shell类型,默认为sh
sudo usermod -s /bin/bash postgres
#设置linux postgres用户密码
sudo passwd postgres
#查看用户
#cat
#删除用户
#sudo userdel -rf postgres
为大页的用户创建一个组,并检索它的GID,然后将自己添加到组中
#创建一个大页的用户组
sudo groupadd my-hugetlbfs
#获取它的GID
sudo getent group my-hugetlbfs
#本例:1002
#添加到postgres至hugetlbfs
sudo adduser postgres my-hugetlbfs
#编辑/etc/sysctl.conf
# Allocate 256*2MiB for HugePageTables (YMMV)
#vm.nr_hugepages = 256
# Members of group my-hugetlbfs(2021) can allocate "huge" Shared memory segment
#vm.hugetlb_shm_group = 2021
sudo sysctl -a|grep kernel.shmmax
sudo vim /etc/sysctl.conf
内存大页还要设置.值为kernel.shmmax的内存/(cat /proc/meminfo |grep -i huge)->Hugepagesize=2097152=2048KB=2MB
注意vm.hugetlb_shm_group=1002是用户组my-hugetlbfs的gid
#大页限制在6.5GB内存
vm.nr_hugepages=3328
vm.hugetlb_shm_group=1002
cat /etc/sysctl.conf
#给这个文件系统创建一个挂载点
sudo mkdir /hugepages
sudo vim /etc/fstab
给这个"/hugepages"目录创建一个挂载点.注意gid=1002是用户组my-hugetlbfs的gid.
hugetlbfs /hugepages hugetlbfs mode=1770,gid=1002 0 0
cat < /etc/fstab
您应该配置用户可以锁定的内存量,以便应用程序不会通过锁定所有内存来使您的操作系统崩溃.请注意:任何页面都可以锁定在RAM中,而不仅仅是大页面.您应该允许该过程锁定更多的内存,而不仅仅是大页面的空间。
sudo vim /etc/security/limits.conf
锁定的RAM内存大小以kB为单位
#1GB = 1024*1024*1024 = 1073741824byte
#6.5GB = 1073741824 * 6.5 = 6442450944byte
#要锁定的内存大小6979321856/1024
#默认可以锁定的物理内存的最大值(硬限制)为:6815744kB
* hard memlock 6815744
cat /etc/security/limits.conf
如果您的内存非常多(TB),可根据cpu类型设置大页大小和数量.
使用hugeadm --page-sizes-all可以查看当前硬件支持的大页大小.
Debian arm64(以4KB标准PAGE_SIZE运行),支持2MB和1GB的巨型TLB页面大小.通过在内核命令行上指定参数,必须在启动时预分配1GB的HugeTLB页面,以下将预先分配10x1GB=10GB的大页面:
sudo vim /etc/default/grub
在GRUB_CMDLINE_LINUX配置中添加以下内容
hugepagesz=1G hugepages=10
更新grub
cat /etc/default/grub
sudo update-grub
重启
sudo reboot
如果一个人选择用CONFIG_ARM64_64K_PAGES=y构建自己的Debian arm64内核,那么只有512MB的HugeTLB(和 THP)页面可用.
根据处理器的不同,x86_64架构上至少有两种不同的大页面大小:2MB和1GB.如果CPU支持2MB页面,则它具有PSE CPU信息标志.对于1GB,它具有PDPE1GB标志.
如果此命令返回非空字符串,则支持2MB页.
grep pse /proc/cpuinfo | uniq
flags : [...] pse [...]
如果此命令返回非空字符串,则支持1GB页.
grep pdpe1gb /proc/cpuinfo | uniq
flags : [...] pdpe1gb [...]
在它们实际上都可用之前,它们可能必须在引导时激活.以下内核引导参数启用1GB页并创建一个1GB页的池:
sudo vim /etc/default/grub
在GRUB_CMDLINE_LINUX配置中添加以下内容
hugepagesz=1GB hugepages=1
更新grub
sudo update-grub
重启
sudo reboot
启动后,巨大的页面池如下所示:
hugeadm --pool-list
Size Minimum Current Maximum Default
2097152 0 0 0 *
1073741824 1 1 1
当前硬件支持的大页页大小,查询结果的单位为Bytes:
hugeadm --page-sizes-all
2097152 #2MB
1073741824 #1GB
hugeadm 还显示每个可用大小的已分配大页数:
hugeadm --pool-list
Size Minimum Current Maximum Default
2097152 3328 3328 3328 * #2MB页大小,最小3328,当前已分配3328,最大可以分配3328, 3328*2097152约为6.5G
1073741824 0 0 0 #未使用1GB页大小,所以未分配
使用/proc/meminfo查看大页信息:
grep Huge /proc/meminfo
标准Debian内核是否启用了HUGETLB
grep HUGETLB /boot/config-$(uname -r)
CONFIG_HUGETLBFS=y
CONFIG_HUGETLB_PAGE=y