设为首页 收藏本站
查看: 845|回复: 0

[经验分享] Linux Performance Tunnel

[复制链接]

尚未签到

发表于 2018-5-20 15:33:26 | 显示全部楼层 |阅读模式
  process:一个独立运行的单位
  资源:CPU资源,内存资源
  
  CPU:
  时间:切片
  缓存:缓存当前程序的数据
  
  内存:
  空间:映射
  线性地址 <---- 物理地址
  线性地址:进程运行时认为自己可使用的空间
  物理地址:实际内存的空间
  
  

  进程描述符:
  进程元数据
  通过一个双向链表(C语言中的struct)描述
  
  Linux:抢占
  系统时钟:时钟
  tick:滴答
  时间解析度
  
  进程类别:
  交互式进程:I/O密集型
  批处理进程:CPU密集型
  实时(Real-time)进程
  
  CPU密集型:时间片长,优先级低
  I/O密集型:时间片短,优先级高
  
  
  Linux优先级:priority
  实时优先级:1--99,数字越小,优先级越低
  top中RT表示实时优先级
  静态优先级:100-139,数字越小,优先级越高;用于描述用户空间进程的优先级
  
  实时优先级比静态优先级高
  
  nice值:调整静态优先级
  
  

  

  查看进程调度类型、优先级
  # ps -e -o class,rtprio,pri,nice,cmd
  CLS RTPRIO PRI  NI CMD
  TS       -  19   0 /sbin/init
  TS       -  19   0 [kthreadd]
  FF      99 139   - [migration/0]
  TS       -  19   0 [ksoftirqd/0]
  FF      99 139   - [migration/0]
  FF      99 139   - [watchdog/0]
  

  中括号代表是内核线程
  

  调度类别:
  实时优先级:
  SCHED_FIFO:First In First Out  FF
  SCHED_RR: RoundRobin    RR
  
  100---139:
  SCHED_Other: 用来调度100-139(用户空间进程)之间的进程   TS
  
  
  动态优先级:
  对于长时间没有获得CPU时间片的进程,会临时调高其优先级
  dynamic_priority=max(100,min( static_priority-bonus+5,139))
  bonus: 0-10
  
  手动调整优先级:
  100---139(用户空间进程优先级):通过nice值调整
  nice N COMMAND
  renice -n # PID
  
  1---99(实时进程优先级):
  通过chrt命令调整
  chrt [options] prio command 进程启动时指定其优先级
  chrt [options] -p [prio] pid调整已启动的进程优先级
  -f, --fifo
                set scheduling policy to SCHED_FIFO
  -r, --rr
                set scheduling policy to SCHED_RR (the default)  
    
    
    
  SMP:
  对称多处理器,多颗CPU内存共享
  
  NUMA:
  每个CPU有自己独立的内存空间
    
    
  CPU affinity:CPU绑定
  将某些进程绑定在一个CPU上运行,避免交叉内存访问
    
  # numastat
                             node0
  numa_hit                  310693
  numa_miss                      0
  numa_foreign                   0
  interleave_hit             13609
  local_node                310693
  other_node                     0  
    
    
  numa_hit:CPU在本地内存上查找数据时的命中率
  numa_miss:CPU在本地内存上查找数据时的丢失率
  numa_foreign:某CPU的本地内存数据第1次就被其他CPU访问
    
  numastat选项:
  -p PID: 查找指定进程的内存分配
  -s NODE: 查看某个NODE的信息
  
  # numastat -s node0
  Found no processes containing pattern: "node0"
  

  Per-node numastat info (in MBs):
                            Node 0           Total
                   --------------- ---------------
  Numa_Hit                 1227.95         1227.95
  Local_Node               1227.95         1227.95
  Interleave_Hit             53.16           53.16
  Numa_Foreign                0.00            0.00
  Numa_Miss                   0.00            0.00
  Other_Node                  0.00            0.00
    
    
    
  # numactl
  # numad
  

  

  

  taskset:绑定进程至某CPU
  以mask(十六进制数字)方式引用CPU
  0x00000001
  is processor #0(第0号CPU)
  
      0x00000003
          is processors #0 and #1
  

      0xFFFFFFFF
          is all processors (#0 through #31)
  将十六进制数转换成二进制数,从右向左看,右侧的第1个数字(值为1的话)表示第0号CPU
  

  # taskset -p mask pid
  将PID为101的进程绑定到3号CPU
  # taskset -p 0x00000004 101
  或者
  # taskset -p -c 3 101
  -c:用于指定CPU编号
  

  

  

  应该将中断绑定至那些非隔离的CPU上,从而避免那些隔离的CPU处理中断
  方法:
  echo CPU_MASK > /proc/irq/irq_number/smp_affinity
  

  

  查看CPU使用率命令
  

  1、sar   查看CPU平均负载
  每1秒显示一次CPU使用率
  # sar -q 1
  Linux 2.6.32-431.el6.x86_64 (localhost.localdomain) 2016年01月26日 _x86_64_(1 CPU)
  

  00时13分42秒   runq-sz  plist-sz   ldavg-1   ldavg-5  ldavg-15
  00时13分43秒         0       201      0.00      0.00      0.00
  00时13分44秒         0       201      0.00      0.00      0.00
  00时13分45秒         0       201      0.00      0.00      0.00
  00时13分46秒         0       201      0.00      0.00      0.00
  00时13分47秒         0       201      0.00      0.00      0.00
  

  

  runq-sz:运行队列的长度
  plist-sz:当前进程的个数
  

  

  

  2、top
  3、w
  4、uptime
  5、mpstat 1
  6、iostat
  7、dstat -c
  

  查看上下文切换的平均次数,及进程创建创建的平均值
  # sar -w 1
    
    
    
  内存子系统组件:
  slab allocator
  buddy system
  kswapd
  pdflush
  mmu
  
  Memory:
  TLB:提升性能
  
  启用HugePages
  方法1:配置内核参数
  # sysctl -w vm.nr_hugepages=10
  vm.nr_hugepages = 10
  

  # cat /proc/meminfo | grep -i Huge
  AnonHugePages:         0 kB
  HugePages_Total:      10
  HugePages_Free:       10
  HugePages_Rsvd:        0
  HugePages_Surp:        0
  Hugepagesize:       2048 kB
  

  方法2:
  配置Hugetlbfs文件系统
  # mkdir /pagehuges
  # mount -t hugetlbfs none /pagehuges
  

  

  

  strace命令:用于追踪某个进程产生的系统调用
  

  监控准备打开进程的系统调用
  # strace cat /etc/fstab
  

  # strace -c cat /etc/fstab
  -c:显示每个系统调用的分析结果
  
  % time     seconds  usecs/call     calls    errors syscall
  ------ ----------- ----------- --------- --------- ----------------
   74.44    0.000067          67         1           write
   25.56    0.000023           8         3           mprotect
    0.00    0.000000           0         3           read
    0.00    0.000000           0         4           open
    0.00    0.000000           0         6           close
    0.00    0.000000           0         5           fstat
    0.00    0.000000           0         9           mmap
    0.00    0.000000           0         1           munmap
    0.00    0.000000           0         3           brk
    0.00    0.000000           0         1         1 access
    0.00    0.000000           0         1           execve
    0.00    0.000000           0         1           arch_prctl
  ------ ----------- ----------- --------- --------- ----------------
  100.00    0.000090                    38         1 total
  
  -o:将追踪结果保存至文件中,以供后续分析使用
  

  监控已经启动进程的系统调用
  # strace -p PID
  

  

  内存优化:
  1、尽可能避免小内存对象的开销 (slab)
  2、降低慢速子系统的服务时间
  FileSystem metadata: buffer cache
  Disk IO: page cache
  Interprocess communication: shared memory
  Network: buffer cache,arp cache,connection tracking
  

  

  调整页面参数
  1、vm.min_free_kbytes
  磁盘速度过慢,将此参数值调小
  CPU性能比较差,将此参数值调小
  
  2、vm.overcommit_memory  调整内存的过量使用
  0:由内核决定如何过量使用
  1:总是可以过量使用,在数据库服务器上尽可能不使用swap
  2:所用内存空间可以大于物理内存(占用swap)
  vm.overcommit_ratio:用于定义可以超出物理内存的百分比
  建议不要超过50%,不要超出swap+物理内存大小
  
  物理内存的过量使用是以swap为前提的
  可以超出物理内存一部分
  

  

  调优slab cache
  调大slab cache可提升CPU处理内存小对象的性能
  

  # cat /proc/slabinfo
  tunables <limit> <batchcount> <sharedfactor>
  <limit>:可以被每个CPU缓存的最大对象数
  <batchcount>:一次性最多可以传送多少个CPU缓存对象
  <sharedfactor>:在SMP中,各CPU中可共享多少个缓存
  
  调整方法:
  在/proc/slabinfo文件中找到对应对象的名称,通过输出重定向,依次提供3个值即可:
  # echo 'ext4_inode_cache 108 54 8' > /proc/slabinfo
  

  # slabtop
  

  

  调优arp cache 
  默认情况下,arp的结果全部缓存在/proc/net/arp文件中,此文件的软限制为512,硬限制为1024
  在网络节点较大的环境中,需要调整此参数
  

  net.ipv4.neigh.default.gc_thresh1
  当arp缓存条目小于128时,内核中的垃圾回收器不予处理
  net.ipv4.neigh.default.gc_thresh2
  软限制数目  默认512
  net.ipv4.neigh.default.gc_thresh3
  硬限制数目,默认为1024
  net.ipv4.neigh.default.gc_interval
  每隔几秒钟清除过期条目
  
  
  调优page cache(用于降低磁盘IO,加速读操作)
  

  vm.lowmem_reserve_ratio
  当内存很低时,预留page cache的空间
  vm.vfs_cahce_pressure
  定义内核在什么时候回收缓存目录或者inode对象的内存
  默认为100
  0表示不回收dentries和inodes内存,有可能导致内存溢出
  1--99:倾向于不回收
  100:倾向性与page cache和swap cache相同
  100+:更倾向于回收
  
  vm.page-cluster
  如果有需要将内存中的页面转到swap内存中,用于定义一次性交换多少个页面 ;
  使用指数定义 2^n ,默认为3,也就是说一次性交换8个页面
  如果需要过多使用swap分区,可以调整此参数,一般不要大于4
  在虚拟化环境中,经常调整
  
  vm.zone_reclaim_mode
  定义更倾向于回收哪一段的内存
  1:打开回收功能
  2:回收写操作产生的脏页
  4:回收用于swap page的页面
  
  

  
  
  Anonymous pages:
  程序数据,堆中的数据
  匿名内存区域
  映射为进程私有页面的脏页面
  进程间通信的共享内存页面
  
  Anonymous pages = RSS-shared
  RSS:实际内存集
  
  进程间通信机制:
  消息:messages
  信号:semaphores
  共享内存:shared memory
  

  进程间通信管理命令:
  1、查看三种机制的值
  # ipcs -l
  

  ------ Shared Memory Limits --------
  max number of segments = 4096
  max seg size (kbytes) = 67108864
  max total shared memory (kbytes) = 17179869184
  min seg size (bytes) = 1
  

  ------ Semaphore Limits --------
  max number of arrays = 128
  max semaphores per array = 250
  max semaphores system wide = 32000
  max ops per semop call = 32
  semaphore max value = 32767
  

  ------ Messages: Limits --------
  max queues system wide = 958
  max size of message (bytes) = 65536
  default max size of queue (bytes) = 65536
  

  2、当进程卡死时,可结束进程
  # ipcrm
  

  

  调整参数:
  1、共享内存 shm
  kernel.shmmni
  在全系统范围内,最大允许使用多少个共享内存段
  默认为4096
  

  kernel.shmall
  在全系统范围内,一次性可以使用的最大共享内存页面数
  默认为2097152
  kernel.shmmax
  单个共享内存段的最大上限
  
  2、消息messages
  kernel.msgmnb
  单个消息队列的最大上限,单位为字节
  默认为16384
  
  kernel.msgmni
  消息队列的个数最大上限
  默认为16
  
  kernel.msgmax
  进程间通信时,所能使用的单个消息的最大上限,单位为字节
  默认为8192
  
  

  

  调整pdflush回收内存脏页
  vm.nr_pdflush_threads:用于显示当前启动了多少个pdflush进程个数
  # cat /proc/sys/vm/nr_pdflush_threads
  0
  按照块设备,一块磁盘一个pdflush进程
  rhel 6会自动调整pdflush进程个数
  
  vm.dirty_background_ratio
  相对于总内存来说,脏页面占多少比例后开始启动清理
  # cat /proc/sys/vm/dirty_background_ratio
  10
  

  vm.dirty_ratio:
  对于单个进程来说,脏页面占多少比例后开始启动清理
  # cat /proc/sys/vm/dirty_ratio
  20
  
  vm.dirty_expire_centisecs
  pdflush周期性启动清理的时间间隔,单位为百分秒
  
  vm.dirty_writeback_centisecs
  脏页在内存中存储多久后过期,需要立即启动清理;单位为百分秒
  
  手动清写脏缓存和脏缓冲
  sync
  echo s > /proc/sysrq-trigger
  echo 3 > /proc/sys/vm/drop_caches
  1: 翻放pagecache
  2:释放dentries和inodes
  3:释放pagecache,dentries,inodes
  # free -m
               total       used       free     shared    buffers     cached
  Mem:           482        464         18          0         34        265
  -/+ buffers/cache:        163        318
  Swap:         2199          0       2199
  

  # sync
  

  # free -m
               total       used       free     shared    buffers     cached
  Mem:           482        464         18          0         34        265
  -/+ buffers/cache:        163        318
  Swap:         2199          0       2199
  

  # echo 1 > /proc/sys/vm/drop_caches
  

  # free -m
               total       used       free     shared    buffers     cached
  Mem:           482        173        308          0          0         14
  -/+ buffers/cache:        159        323
  Swap:         2199          0       2199
  
  
  

  

  /proc/sys/vm/panic_on_oom
  0:当内存耗尽时,启动oom(out-of-memory)
  1:表示禁用oom killer
  

  oom_score:
  -16--15:协助计算oom_score
  oom_adj
  -17:禁止杀死该进程
  

  

  使用valgrind评估内存泄露
  

  # valgrind [valgrind-options] [your-program] [your-program-options]
  

  # valgrind --tool=memcheck cat /proc/$$/maps
  $$:当前进程ID
  
  # watch -n 1 'ps axo pid,comm,rss,vsize | grep httpd'
  rss,vsize只增不减,有可能为内存泄露
  # sar -R 1 120
  

  

  提高swap性能
  1、降低swap think time,使用小swap分区
  2、降低访问次数
  增大物理内存
  使用多个swap分区,在多块硬盘上创建出多个swap分区
  3、降低服务时间
  使用快速设备(比如ssd磁盘)
  将swap放在磁盘的最外道分区
  

  调整使用swap的概率
  vm.swappiness
  % of memory mapped into page tables+vm.swappiness >= 100
  
  系统调优方面
  进程管理,CPU
  内存调优
  I/O
  文件系统
  网络子系统
  
  swap size:
  科学运算服务器:4*RAM
  Database Server: <=1GB
  Application Server: >=0.5GB
  

  

  调优swap性能:
  1、在多个磁盘上创建多个swap分区
  /dev/sda1swap swap pri=50 0
  /dev/sdb1swapswap pri=5  0 0
  

  

  

  监控内存状态
  1、vmstat -n [interval] [count]
  2、sar -r [interval] [count]
  3、sar -R [interval] [count]
  4、sar -W [interval] [count]
  5、sar -B [interval] [count]
  
  调优思路:
  性能指标:定位瓶颈
  调优
  
  
  
  
  
  
  
  
  
  
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-467696-1-1.html 上篇帖子: linux inotify+rsync 下篇帖子: Linux常用服务ftp
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表