rhel7.2 优化技巧

简介: 对 journal 信息永久化保存方法针对 systemd-journald.service 服务默认只把信息存放与内存进行优化, 改变当服务器长期启动, 无法利用 journald 命令获取服务状态信息修改 /etc/systemd/journald.conf 添加 Storage=persistent可利用系统文件对 journal 信息进行永久保存

对 journal 信息永久化保存方法

针对 systemd-journald.service 服务默认只把信息存放与内存进行优化,  改变当服务器长期启动,  无法利用 journald 命令获取服务状态信息
修改 /etc/systemd/journald.conf 
添加 Storage=persistent
可利用系统文件对 journal 信息进行永久保存

优化 sysct.conf

/proc/sys/kernel/panic   10                                        (kernel panic 重启时间)
/proc/sys/kernel/perf_event_max_sample_rate  100000                (提高 kernel 中断)
/proc/sys/kernel/printk       7       4       1       7            (内核调试信息打印)
/proc/sys/net/netfilter/nf_conntrack_max   4194304                 (增加 iptables 链路)  echo $[128*1024*1024*1024/16384/2]
/proc/sys/net/netfilter/nf_conntrack_buckets  524288               (hash size)   echo $[128*1024*1024*1024/131072/2]
/proc/sys/vm/dirty_ratio   30
/proc/sys/vm/swappiness    10
/proc/sys/vm/overcommit_memory   2                                 (拒绝内存超配)
/proc/sys/vm/max_map_count               可 > 65535                (某个进程可能使用的最大内存映射区域)

PCP 使用参考

参考: http://www.pcp.io/docs/guide.html

PCP主要用于对系统进程进行分析, 显示当前进程资源使用情况, 可以根据返回值对进程资源使用进行判断

查询可用项目
pminfo -h localhost

例子: 查询磁盘启动到现在的read 信息

[root@gx-yun-084036 .ssh]# pminfo -h localhost -dfmtT disk.partitions.read_bytes

    disk.partitions.read_bytes PMID: 60.10.6 [number of bytes read for storage partitions]
            Data Type: 32-bit unsigned int  InDom: 60.10 0xf00000a
            Semantics: counter  Units: Kbyte
    Help:
    Cumulative number of bytes read since system boot time (subject to
    counter wrap) for individual disk partitions or logical volumes.
            inst [0 or "sda1"] value 22367
            inst [1 or "sda2"] value 592513
            inst [2 or "sda3"] value 1424
            inst [3 or "sdb1"] value 557470
            inst [4 or "sdc1"] value 1568

持续地观察当前磁盘的读写状态

[root@gx-yun-084036 .ssh]#  pmval -t 2sec -f 3 disk.partitions.write -h localhost

metric:    disk.partitions.write
host:      gx-yun-084036.vclound.com
semantics: cumulative counter (converting to rate)
units:     count (converting to count / sec)
samples:   all
         sda1                  sda2                  sda3                  sdb1                  sdc1
        0.000                 0.000                 0.000                 0.000                 0.000
        0.000                 0.000                 0.000                 0.000                 0.000
        0.000                 2.498                 0.000                 0.500                 0.500
        0.000                 2.498                 0.000                 0.000                 0.000
        0.000                 0.000                 0.000                 0.000                 0.000

另外一个例

[root@gx-yun-084036 .ssh]# pmdumptext -Xlimu -t 2sec 'kernel.all.load[1]' mem.util.used disk.partitions.write -h localhost

[ 1] localhost:kernel.all.load["1 minute"]
[ 2] localhost:mem.util.used
[ 3] localhost:disk.partitions.write["sda1"]
[ 4] localhost:disk.partitions.write["sda2"]
[ 5] localhost:disk.partitions.write["sda3"]
[ 6] localhost:disk.partitions.write["sdb1"]
[ 7] localhost:disk.partitions.write["sdc1"]

             Column          1       2       3       4       5       6       7
             Source     localh  localh  localh  localh  localh  localh  localh
             Metric       load    used   write   write   write   write   write
               Inst     1 minu     n/a    sda1    sda2    sda3    sdb1    sdc1
              Units       none       b     c/s     c/s     c/s     c/s     c/s
Mon Sep 26 16:20:07      0.08   14.78G       ?       ?       ?       ?       ?
Mon Sep 26 16:20:09      0.08   14.78G   0.00    0.00    0.00    0.00    0.00
Mon Sep 26 16:20:11      0.08   14.78G   0.00   36.00    0.00    0.00    0.00
Mon Sep 26 16:20:13      0.07   14.78G   0.00    2.50    0.00    0.50    0.50
Mon Sep 26 16:20:15      0.07   14.78G   0.00    0.00    0.00    0.50    0.00
Mon Sep 26 16:20:17      0.07   14.78G   0.00    0.00    0.00    0.00    0.00

pcp atop 可实时监控当前资源(RHEL7.2 以上可用)

实时监控系统资源

[root@gx-yun-084036 .ssh]# pmcollectl

#<---------CPU---------><------------Disks----------><--------Network---------->
#cpu    sys inter  ctxsw KBRead  Reads KBWrit Writes KBIn  PktIn  KBOut  PktOut
     0     0   888   1773      0      0     8      6    54     81      7     73
     0     0   620   1712      0      0     4      3    55     96      7     88
     0     0   736   1539      0      0     0      0   187    229     32    208
     0     0   647   1222      0      0     0      0   210    206     18    159
     0     0   555   1061      0      0    64      2    61     90     10     83
     0     0   432    840      0      0     0      0    84    110     11    101
     0     0   511   1025      0      0     0      0     7     49      7     49

stap 监控参考

stap 一个不错的系统监控工具, 能够满足对进程的监控

yum install -y  systemtap*

其中 systemtap-client 软件包中包含了一些常用的管理脚本, 当然, 可以自行进行编程实现对系统的监控显示
需要安装下面软件包才可以满足 stap 命令使用

rpm -ivh kernel-debuginfo-3.10.0-327.el7.x86_64.rpm  kernel-debuginfo-common-x86_64-3.10.0-327.el7.x86_64.rpm

当前系统进程 IO 最猛的几个进程

iostop.stp

#!/usr/bin/stap
global io_stat,device
global read_bytes,write_bytes

probe vfs.read.return {
  if ($return>0) {
    if (devname!="N/A") {/*skip read from cache*/
      io_stat[pid(),execname(),uid(),ppid(),"R"] += $return
      device[pid(),execname(),uid(),ppid(),"R"] = devname
      read_bytes += $return
    }
  }
}

probe vfs.write.return {
  if ($return>0) {
    if (devname!="N/A") { /*skip update cache*/
      io_stat[pid(),execname(),uid(),ppid(),"W"] += $return
      device[pid(),execname(),uid(),ppid(),"W"] = devname
      write_bytes += $return
    }
  }
}

probe timer.ms(5000) {
  /* skip non-read/write disk */
  if (read_bytes+write_bytes) {

    printf("\n%-25s, %-8s%4dKb/sec, %-7s%6dKb, %-7s%6dKb\n\n",
           ctime(gettimeofday_s()),
           "Average:", ((read_bytes+write_bytes)/1024)/5,
           "Read:",read_bytes/1024,
           "Write:",write_bytes/1024)
    /* print header */
    printf("%8s %8s %8s %25s %8s %4s %12s\n",
           "UID","PID","PPID","CMD","DEVICE","T","BYTES")
  }
  /* print top ten I/O */

  foreach ([process,cmd,userid,parent,action] in io_stat- limit 10)
    printf("%8d %8d %8d %25s %8s %4s %12d\n",
           userid,process,parent,cmd,
           device[process,cmd,userid,parent,action],
           action,io_stat[process,cmd,userid,parent,action])

  /* clear data */

  delete io_stat
  delete device
  read_bytes = 0
  write_bytes = 0
}

probe end{
  delete io_stat
  delete device
  delete read_bytes
  delete write_bytes
}

参考
[root@gx-yun-084036 io]# cat iotop.stp

#!/usr/bin/stap
global reads, writes, total_io
probe vfs.read.return {
    reads[execname()] += bytes_read
}

probe vfs.write.return {
    writes[execname()] += bytes_written
}

# print top 10 IO processes every 5 seconds

probe timer.s(5) {
    foreach (name in writes)
        total_io[name] += writes[name]
    foreach (name in reads)
        total_io[name] += reads[name]
    printf ("%16s\t%10s\t%10s\n", "Process", "KB Read", "KB Written")
    foreach (name in total_io- limit 10)
        printf("%16s\t%10d\t%10d\n", name,
               reads[name]/1024, writes[name]/1024)
    delete reads
    delete writes
    delete total_io
    print("\n")
}

效果如下 stap iotop.stp

         Process           KB Read      KB Written
              dd           2048036         2048000
          docker                41               1
   zabbix_agentd                39               0
        cadvisor                24               0
         dmsetup                15               0
    ovsdb-server                 0               7
            bash                 7               0
       netplugin                 5               0
    ovs-vswitchd                 2               0
            sshd                 1               1

在一定时间内, 系统中那些文件执行了读写

iotime.stp

#!/usr/bin/stap

global start
global time_io

function timestamp:long() { return gettimeofday_us() - start }
function proc:string() { return sprintf("%d (%s)", pid(), execname()) }
probe begin { start = gettimeofday_us() }
global filehandles, fileread, filewrite

probe syscall.open.return {
  filename = user_string($filename)
  if ($return != -1) {
    filehandles[pid(), $return] = filename
  } else {
    printf("%d %s access %s fail\n", timestamp(), proc(), filename)
  }
}

probe syscall.read.return {
  p = pid()
  fd = $fd
  bytes = $return
  time = gettimeofday_us() - @entry(gettimeofday_us())
  if (bytes > 0)
    fileread[p, fd] += bytes
  time_io[p, fd] <<< time
}

probe syscall.write.return {
  p = pid()
  fd = $fd
  bytes = $return
  time = gettimeofday_us() - @entry(gettimeofday_us())
  if (bytes > 0)
    filewrite[p, fd] += bytes
  time_io[p, fd] <<< time
}

probe syscall.close {
  if ([pid(), $fd] in filehandles) {
    printf("%d %s access %s read: %d write: %d\n",
           timestamp(), proc(), filehandles[pid(), $fd],
           fileread[pid(), $fd], filewrite[pid(), $fd])
    if (@count(time_io[pid(), $fd]))
      printf("%d %s iotime %s time: %d\n",  timestamp(), proc(),
             filehandles[pid(), $fd], @sum(time_io[pid(), $fd]))
   }
  delete fileread[pid(), $fd]
  delete filewrite[pid(), $fd]
  delete filehandles[pid(), $fd]
  delete time_io[pid(),$fd]
}

效果如下 [root@gx-yun-084036 io]# stap iotime.stp -c “sleep 1”

66449 28145 (sleep) access /etc/ld.so.cache read: 0 write: 0
66515 28145 (sleep) access /lib64/libc.so.6 read: 832 write: 0
66519 28145 (sleep) iotime /lib64/libc.so.6 time: 2
66739 28145 (sleep) access /usr/lib/locale/locale-archive read: 0 write: 0
573033 2747 (zabbix_agentd) access /proc/stat read: 8191 write: 0
573046 2747 (zabbix_agentd) iotime /proc/stat time: 1317
1034282 28148 (dmsetup) access /etc/ld.so.cache read: 0 write: 0
1034350 28148 (dmsetup) access /lib64/libdevmapper.so.1.02 read: 832 write: 0
1034355 28148 (dmsetup) iotime /lib64/libdevmapper.so.1.02 time: 2
1034394 28148 (dmsetup) access /lib64/librt.so.1 read: 832 write: 0

当前磁盘 IO 是主要由那个进程导致

disktop.stp

#!/usr/bin/stap

global io_stat,device
global read_bytes,write_bytes

probe vfs.read.return {
  if ($return>0) {
    if (devname!="N/A") {/*skip read from cache*/
      io_stat[pid(),execname(),uid(),ppid(),"R"] += $return
      device[pid(),execname(),uid(),ppid(),"R"] = devname
      read_bytes += $return
    }
  }
}

probe vfs.write.return {
  if ($return>0) {
    if (devname!="N/A") { /*skip update cache*/
      io_stat[pid(),execname(),uid(),ppid(),"W"] += $return
      device[pid(),execname(),uid(),ppid(),"W"] = devname
      write_bytes += $return
    }
  }
}

probe timer.ms(5000) {

  /* skip non-read/write disk */

  if (read_bytes+write_bytes) {
    printf("\n%-25s, %-8s%4dKb/sec, %-7s%6dKb, %-7s%6dKb\n\n",
           ctime(gettimeofday_s()),
           "Average:", ((read_bytes+write_bytes)/1024)/5,
           "Read:",read_bytes/1024,
           "Write:",write_bytes/1024)
    /* print header */

    printf("%8s %8s %8s %25s %8s %4s %12s\n",
           "UID","PID","PPID","CMD","DEVICE","T","BYTES")
  }

  /* print top ten I/O */

  foreach ([process,cmd,userid,parent,action] in io_stat- limit 10)
    printf("%8d %8d %8d %25s %8s %4s %12d\n",
           userid,process,parent,cmd,
           device[process,cmd,userid,parent,action],
           action,io_stat[process,cmd,userid,parent,action])

  /* clear data */

  delete io_stat
  delete device
  read_bytes = 0
  write_bytes = 0
}


probe end{
  delete io_stat
  delete device
  delete read_bytes
  delete write_bytes
}

效果如下

[root@gx-yun-084036 io]# stap disktop.stp

Thu Sep 22 07:40:41 2016 , Average:415962Kb/sec, Read:      68Kb, Write: 2079746Kb

         UID      PID       PPID                       CMD   DEVICE    T        BYTES
             0    48463    44947                        dd     sda2    W    209715200
             0    48510    44947                        dd     sda2    W    209715200
             0    48511    44947                        dd     sda2    W    209715200
             0    48512    44947                        dd     sda2    W    209715200
             0    48513    44947                        dd     sda2    W    209715200
             0    48514    44947                        dd     sda2    W    209715200
             0    48515    44947                        dd     sda2    W    209715200
             0    48516    44947                        dd     sda2    W    209715200
             0    48517    44947                        dd     sda2    W    209715200
             0    48518    44947                        dd     sda2    W    209715200
目录
相关文章
|
分布式计算 网络协议 NoSQL
Linux故障排除思路以及影响Linux性能的各种原因| 学习笔记
快速学习Linux故障排除思路以及影响Linux性能的各种原因。
151 0
|
缓存 监控 Linux
Linux性能优化之内存性能评估工具
一、内存性能评估之free命令 二、内存性能评估之Sat/pidstat命令 三、磁盘性能评估
Linux性能优化之内存性能评估工具
|
运维 分布式计算 网络协议
Linux故障排除思路以及影响Linux性能的各种原因
系统故障排除思路 重视报错信息 永远不要忘记日志文件 分析、定位、解决问题 影响Linux性能的各种因素服务器硬件因素 操作系统相关因素 程序因素 Linux性能优化工具 cpu性能优化工具vmstat.iostat sar 内存性能检测工具:free、top、sar、pidstat 磁盘性能评估工具 :iostat、sar 网络性能分析工具: ping、mtr、netstat 系统性能分析标准 几个故障处理案例和性能优化案例 su命令切换用户导致的问题
|
Linux BI
一文掌握 Linux 性能分析之 I/O 篇
一文掌握 Linux 性能分析之 I/O 篇 这是 Linux 性能分析系列的第三篇,前两篇分别讲了 CPU 和 内存,本篇来看 IO。 IO 和 存储密切相关,存储可以概括为磁盘,内存,缓存,三者读写的性能差距非常大,磁盘读写是毫秒级的(一般 0.1-10ms),内存读写是微妙级的(一般 0.1-10us),cache 是纳秒级的(一般 1-10ns)。
2082 0
|
网络协议 Linux 网络安全
|
缓存 网络协议 Linux
|
存储 缓存 网络协议