优化
1 2 3 4 5 6 | nodes=(http: //125 .88.182.172:5880 http: //103 .224.251.67 http: //128 .1.164.196); for node in ${nodes[@]}; do echo $node done |
执行结果:
1 2 3 4 | [root@xuegod-node1 docker] # sh aa.sh http: //125 .88.182.172:5880 http: //103 .224.251.67 http: //128 .1.164.196 |
curl -sS --connect-timeout 3 -m 60 $node/check.txt
1 2 3 4 | -s /--silent 静音模式。不输出任何东西 -S /--show-error 显示错误,在选项 -s 中,当 curl 出现错误时将显示 --connect-timeout SECONDS 连接超时设置 -m, --max- time SECONDS 允许的最多传输时间 |
[root@xuegod-node1 docker]# sysctl -a|grep fs.file #查看系统级限制 最大打开文件描述符的限制。
fs.file-max = 95896
fs.file-nr = 2880 0 95896
fs.xfs.filestream_centisecs = 3000
[root@xuegod-node1 docker]# ulimit -n #查看用户级限制 最大打开文件描述符的限制
1024
[root@xuegod-node1 docker]# ulimit -Hn #查看硬限制
4096
[root@xuegod-node1 docker]# ulimit -Sn #查看软限制
1024
虚拟内存地址和物理内存地址的分离,给进程带来便利性和安全性。但虚拟内存地址和物理内存地址的翻译,又会额外耗费计算机资源。如果把物理内存和进程空间的地址都分成页,内核只需要记录页的对应关系。因此内存分页,可以极大地减少所要记录的内存对应关系。
参考地址:https://www.cnblogs.com/vamei/p/9329278.html
查看内存分页大小
1 2 | [root@xuegod-node1 docker] # getconf PAGE_SIZE 4096 |
脚本开始执行的时间,执行结束的时间。
1、sleep : 默认为秒。
sleep 1s 表示延迟一秒
sleep 1m 表示延迟一分钟
sleep 1h 表示延迟一小时
sleep 1d 表示延迟一天
star=`date +%s.%N`
sleep 5s
end=`date +%s.%N`
echo $star
echo $end
##########################################
内存分页大小对性能的提升原理
参考:https://blog.csdn.net/achang21/article/details/69831476
什么是内存分页?
我们知道,CPU是通过寻址来访问内存的。32位CPU的寻址宽度是 0~0xFFFFFFFF ,计算后得到的大小是4G,也就是说可支持的物理内存最大是4G。
但在实践过程中,碰到了这样的问题,程序需要使用4G内存,而可用物理内存小于4G,导致程序不得不降低内存占用。
为了解决此类问题,现代CPU引入了 MMU(Memory Management Unit 内存管理单元)。
MMU 的核心思想是利用虚拟地址替代物理地址,即CPU寻址时使用虚址,由 MMU 负责将虚址映射为物理地址。
MMU的引入,解决了对物理内存的限制,对程序来说,就像自己在使用4G内存一样。
内存分页(Paging)是在使用MMU的基础上,提出的一种内存管理机制。它将虚拟地址和物理地址按固定大小(4K)分割成页(page)和页帧(page frame),并保证页与页帧的大小相同。
这种机制,从数据结构上,保证了访问内存的高效,并使OS能支持非连续性的内存分配。
在程序内存不够用时,还可以将不常用的物理内存页转移到其他存储设备上,比如磁盘,这就是大家耳熟能详的虚拟内存。
在上文中提到,虚拟地址与物理地址需要通过映射,才能使CPU正常工作。
而映射就需要存储映射表。在现代CPU架构中,映射关系通常被存储在物理内存上一个被称之为页表(page table)的地方。
如下图:
从这张图中,可以清晰地看到CPU与页表,物理内存之间的交互关系。
进一步优化,引入TLB(Translation lookaside buffer,页表寄存器缓冲)
由上一节可知,页表是被存储在内存中的。我们知道CPU通过总线访问内存,肯定慢于直接访问寄存器的。
为了进一步优化性能,现代CPU架构引入了TLB,用来缓存一部分经常访问的页表内容。
如下图:
对比 9.6 那张图,在中间加入了TLB。
为什么要支持大内存分页?
TLB是有限的,这点毫无疑问。当超出TLB的存储极限时,就会发生 TLB miss,之后,OS就会命令CPU去访问内存上的页表。如果频繁的出现TLB miss,程序的性能会下降地很快。
为了让TLB可以存储更多的页地址映射关系,我们的做法是调大内存分页大小。
如果一个页4M,对比一个页4K,前者可以让TLB多存储1000个页地址映射关系,性能的提升是比较可观的。
调整OS内存分页
在Linux和windows下要启用大内存页,有一些限制和设置步骤。
Linux:
限制:需要2.6内核以上或2.4内核已打大内存页补丁。
确认是否支持,请在终端敲如下命令:
# cat /proc/meminfo | grep Huge
HugePages_Total: 0
HugePages_Free: 0
Hugepagesize: 2048 kB
如果有HugePage字样的输出内容,说明你的OS是支持大内存分页的。Hugepagesize就是默认的大内存页size。
文件描述符
更加详细的介绍:linux的ulimit各种限制之深入分析
(1).文件描述符的定义
文件描述符是内核为了高效管理已被打开的文件所创建的索引,用于指向被打开的文件,所有执行I/O操作的系统调用都通过文件描述符来指代被打开的文件;文件描述符用以表明每个被进程打开的文件。
程序刚刚启动时,第一个打开的文件是0,第二个是1,以此类推。也可以理解为文件的身份ID。
用户通过操作系统处理信息的过程中,使用的交互设备文件(键盘,鼠标,显示器)
文件描述符 | 通道名 | 描述 | 默认连接 | 用途 |
0 | stdin | 标准输入 | 键盘 | read only |
1 | stdout | 标准输出 | 终端 | write only |
2 | stderr | 标准错误 | 终端 | write only |
3以上 | filename | 其他文件 | none | read and/or write |
标准输入输出说明
stdin,标准输入,默认设备是键盘,文件编号为0
stdout,标准输出,默认设备是显示器,文件编号为1,也可以重定向到文件
stderr,标准错误,默认设备是显示器,文件编号为2,也可以重定向到文件
(2).查看一个进程打开了哪些文件
语法: ll /proc/[进程ID]/fd
1 2 3 4 5 6 7 8 9 10 11 12 | [xf@xuexi ~]$ vim a.txt [1]+ 已停止 vim a.txt [xf@xuexi ~]$ ps -aux | grep vim xf 11990 0.6 0.2 151796 5396 pts /0 T 16:37 0:00 vim a.txt xf 11998 0.0 0.0 112724 988 pts /0 S+ 16:37 0:00 grep --color=auto vim [xf@xuexi ~]$ ll /proc/11990/fd 总用量 0 lrwx------. 1 xf xf 64 2月 21 16:37 0 -> /dev/pts/0 lrwx------. 1 xf xf 64 2月 21 16:37 1 -> /dev/pts/0 lrwx------. 1 xf xf 64 2月 21 16:37 2 -> /dev/pts/0 lrwx------. 1 xf xf 64 2月 21 16:37 4 -> /home/xf/ .a.txt.swp |
0、1、2也就是宏STDIN_FILENO、STDOUT_FILENO、STDERR_FILENO。
1 2 | STDIN_FILENO:接收键盘的输入 STDOUT_FILENO:向屏幕输出 |
/proc/[进程ID]/fd这个目录专门用于存放文件描述符
另外还可以使用ls -l /proc/self/fd。
(3).文件描述符限制
Linux中最大文件描述符的限制有两个方面,一个是用户级限制,一个是系统级限制。
用户级限制(ulimit命令):也就是说每一个用户登录后执行的程序占用文件描述符的总数不能超过这个限制
系统级限制(sysctl命令):限制所有用户打开文件描述符的总和。
查看系统级限制
1 2 | [xf@xuexi ~]$ sysctl -a | grep file -max [xf@xuexi ~]$ cat /proc/sys/fs/file-max |
查看用户级限制
1 2 3 4 5 6 | [xf@xuexi ~]$ ulimit -n //-n 打开文件描述符的最大个数 1024 [xf@xuexi ~]$ ulimit -Sn //-S 是软性限额 1024 [xf@xuexi ~]$ ulimit -Hn //-H 是硬性限额 4096 |
1)修改用户级限制
- 临时修改,只对当前Shell有效
1 2 3 | [xf@xuexi ~]$ ulimit -n 2048 // 没有指定-S和-H选项时会同时修改软性和硬性限额 [xf@xuexi ~]$ ulimit -Hn 4096 #非root用户不能修改 bash : ulimit : open files: 无法修改 limit 值: 不允许的操作 |
- 永久修改
1 2 | vim /etc/security/limits .conf #注意<item>字段下是否存在nofile字段,如果存在请修改,不存在请添加。<br>* hard nofile 4096 * soft nofile 2048 |
添加完成后保存退出,重启系统,即可生效。
2)修改系统限制级
修改系统限制级临时或永久修改都需要使用root用户。
- 临时修改
1 2 | [root@xuexi ~] # sysctl -w fs.file-max=8192 fs. file -max = 8192 |
- 永久修改
1 2 | [root@xuexi ~] # vim /etc/sysctl.conf<br>fs.file-max=value [root@xuexi ~] # sysctl -p #重启系统或使用sysctl -p重新读取参数 |
注:有些人说root用户使用命令sysctl -w fs.file-max=10000,接着sysctl -p就可永久修改。可是我试下来重启系统后就会还原,有时间的可以试一下。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现