zoukankan      html  css  js  c++  java
  • 优化

    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
    

      执行结果:

    [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

    -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

    查看内存分页大小

    [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,用来缓存一部分经常访问的页表内容。
    如下图:

    加入了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

    [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。

    STDIN_FILENO:接收键盘的输入
    STDOUT_FILENO:向屏幕输出

      /proc/[进程ID]/fd这个目录专门用于存放文件描述符

      另外还可以使用ls -l /proc/self/fd。

    (3).文件描述符限制

      Linux中最大文件描述符的限制有两个方面,一个是用户级限制,一个是系统级限制。

      用户级限制(ulimit命令):也就是说每一个用户登录后执行的程序占用文件描述符的总数不能超过这个限制

      系统级限制(sysctl命令):限制所有用户打开文件描述符的总和。

    查看系统级限制

    [xf@xuexi ~]$ sysctl -a | grep file-max
    [xf@xuexi ~]$ cat /proc/sys/fs/file-max

    查看用户级限制

    [xf@xuexi ~]$ ulimit -n  //-n打开文件描述符的最大个数
    1024
    [xf@xuexi ~]$ ulimit -Sn  //-S是软性限额
    1024
    [xf@xuexi ~]$ ulimit -Hn  //-H是硬性限额
    4096

    1)修改用户级限制

    • 临时修改,只对当前Shell有效
    [xf@xuexi ~]$ ulimit -n 2048  //没有指定-S和-H选项时会同时修改软性和硬性限额
    [xf@xuexi ~]$ ulimit -Hn 4096   #非root用户不能修改
    bash: ulimit: open files: 无法修改 limit 值: 不允许的操作
    • 永久修改   
    vim /etc/security/limits.conf  #注意<item>字段下是否存在nofile字段,如果存在请修改,不存在请添加。
    * hard nofile 4096 * soft nofile 2048

      添加完成后保存退出,重启系统,即可生效。

    2)修改系统限制级

      修改系统限制级临时或永久修改都需要使用root用户。

    • 临时修改
    [root@xuexi ~]# sysctl -w fs.file-max=8192
    fs.file-max = 8192
    • 永久修改
    [root@xuexi ~]# vim /etc/sysctl.conf
    fs.file-max=value [root@xuexi ~]# sysctl -p #重启系统或使用sysctl -p重新读取参数

      

      注:有些人说root用户使用命令sysctl -w fs.file-max=10000,接着sysctl -p就可永久修改。可是我试下来重启系统后就会还原,有时间的可以试一下。

  • 相关阅读:
    Java8系列之重新认识HashMap(转)
    kafka 消费者和生产者测试类
    zookeeper配置
    JNLP应用程序无法打开的解决办法
    Functional Programming 资料收集
    Python的问题解决: IOError: [Errno 32] Broken pipe
    python的subprocess的简单使用和注意事项
    Python tricks(7) -- new-style class的__slots__属性
    Python tricks(6) -- python代码执行的效率
    Python tricks(5) -- string和integer的comparison操作
  • 原文地址:https://www.cnblogs.com/linuxws/p/10771096.html
Copyright © 2011-2022 走看看