- A+
主要配置信息
CPU:4核2.2GHz,内存:32GB,硬盘:60GB
一、查看基础信息
1.查看CPU信息
- [root@odoodev ~]# cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l
- 4
- [root@odoodev ~]#
2.查看内存信息
- [root@odoodev ~]# dmidecode -t memory
- # dmidecode 3.1
- Getting SMBIOS data from sysfs.
- SMBIOS 2.4 present.
- Handle 0x1000, DMI type 16, 15 bytes
- Physical Memory Array
- Location: Other
- Use: System Memory
- Error Correction Type: Multi-bit ECC
- Maximum Capacity: 32 GB
- Error Information Handle: Not Provided
- Number Of Devices: 2
- Handle 0x1100, DMI type 17, 21 bytes
- Memory Device
- Array Handle: 0x1000
- Error Information Handle: 0x0000
- Total Width: 64 bits
- Data Width: 64 bits
- Size: 16384 MB
- Form Factor: DIMM
- Set: None
- Locator: DIMM 0
- Bank Locator: Not Specified
- Type: RAM
- Type Detail: None
- Handle 0x1101, DMI type 17, 21 bytes
- Memory Device
- Array Handle: 0x1000
- Error Information Handle: 0x0000
- Total Width: 64 bits
- Data Width: 64 bits
- Size: 16384 MB
- Form Factor: DIMM
- Set: None
- Locator: DIMM 1
- Bank Locator: Not Specified
- Type: RAM
- Type Detail: None
- [root@odoodev ~]#
3.查看硬盘信息
- [root@odoodev ~]# fdisk -l
- 磁盘 /dev/vda:64.4 GB, 64424509440 字节,125829120 个扇区
- Units = 扇区 of 1 * 512 = 512 bytes
- 扇区大小(逻辑/物理):512 字节 / 512 字节
- I/O 大小(最小/最佳):512 字节 / 512 字节
- 磁盘标签类型:dos
- 磁盘标识符:0x000ca9d8
- 设备 Boot Start End Blocks Id System
- /dev/vda1 * 2048 2099199 1048576 83 Linux
- /dev/vda2 2099200 125829119 61864960 8e Linux LVM
- 磁盘 /dev/mapper/centos_pgsqlhosta-root:38.2 GB, 38235275264 字节,74678272 个扇区
- Units = 扇区 of 1 * 512 = 512 bytes
- 扇区大小(逻辑/物理):512 字节 / 512 字节
- I/O 大小(最小/最佳):512 字节 / 512 字节
- 磁盘 /dev/mapper/centos_pgsqlhosta-swap:6442 MB, 6442450944 字节,12582912 个扇区
- Units = 扇区 of 1 * 512 = 512 bytes
- 扇区大小(逻辑/物理):512 字节 / 512 字节
- I/O 大小(最小/最佳):512 字节 / 512 字节
- 磁盘 /dev/mapper/centos_pgsqlhosta-home:18.7 GB, 18668847104 字节,36462592 个扇区
- Units = 扇区 of 1 * 512 = 512 bytes
- 扇区大小(逻辑/物理):512 字节 / 512 字节
- I/O 大小(最小/最佳):512 字节 / 512 字节
- [root@odoodev ~]# df -Th
- 文件系统 类型 容量 已用 可用 已用% 挂载点
- /dev/mapper/centos_pgsqlhosta-root xfs 36G 14G 22G 39% /
- devtmpfs devtmpfs 16G 0 16G 0% /dev
- tmpfs tmpfs 16G 12K 16G 1% /dev/shm
- tmpfs tmpfs 16G 1.6G 15G 11% /run
- tmpfs tmpfs 16G 0 16G 0% /sys/fs/cgroup
- /dev/vda1 xfs 1014M 206M 809M 21% /boot
- /dev/mapper/centos_pgsqlhosta-home xfs 18G 18G 20K 100% /home
- tmpfs tmpfs 3.2G 0 3.2G 0% /run/user/26
- tmpfs tmpfs 3.2G 12K 3.2G 1% /run/user/42
- tmpfs tmpfs 3.2G 0 3.2G 0% /run/user/0
- [root@odoodev ~]#
二、性能评估
网络带宽 Odoo 对带宽要求较高,一般建议 10用户 /M 带宽。
1.系统整体性能评估
- [root@odoodev ~]# uptime
- 14:08:33 up 34 days, 22:38, 1 user, load average: 0.01, 0.02, 0.05
load average这个输出值,这三个值的大小一般不能大于系统CPU的个数,例如,本输出中系统有4个CPU,如果load average的三个值长期大于4时,说明CPU很繁忙,负载很高,可能会影响系统性能,但是偶尔大于4时,倒不用担心,一般不会影响系统性能。相反,如果load average的输出值小于CPU的个数,则表示CPU还有空闲的时间片,比如本例中的输出,CPU是非常空闲的。
2.cpu性能评估
(1)利用vmstat命令监控系统CPU
该命令可以显示关于系统各种资源之间相关性能的简要信息,这里我们主要用它来看CPU一个负载情况。
下面是vmstat命令在某个系统的输出结果:
- [root@odoodev ~]# vmstat 2 5 #每2秒更新信息,统计5次
- procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
- r b swpd free buff cache si so bi bo in cs us sy id wa st
- 1 0 0 24778076 2120 6110512 0 0 0 6 1 2 1 0 99 0 0
- 0 0 0 24777928 2120 6110524 0 0 0 0 222 244 1 0 99 0 0
- 0 0 0 24777324 2120 6110524 0 0 0 56 296 332 1 0 99 0 0
- 0 0 0 24778944 2120 6110532 0 0 0 0 123 161 0 0 100 0 0
- 0 0 0 24778960 2120 6110532 0 0 0 4 128 151 0 0 100 0 0
- [root@odoodev ~]#
目前,CPU充足。
Procs
r列表示运行和等待cpu时间片的进程数,这个值如果长期大于系统CPU的个数,说明CPU不足,需要增加CPU。
b列表示在等待资源的进程数,比如正在等待I/O、或者内存交换等。
Cpu
us列显示了用户进程消耗的CPU 时间百分比。us的值比较高时,说明用户进程消耗的cpu时间多,但是如果长期大于50%,就需要考虑优化程序或算法。
sy列显示了内核进程消耗的CPU时间百分比。Sy的值较高时,说明内核消耗的CPU资源很多。
根据经验,us+sy的参考值为80%,如果us+sy大于 80%说明可能存在CPU资源不足。
(2) 利用sar命令监控系统CPU
sar功能很强大,可以对系统的每个方面进行单独的统计,但是使用sar命令会增加系统开销,不过这些开销是可以评估的,对系统的统计结果不会有很大影响。
下面是sar命令对某个系统的CPU统计输出:
- [root@odoodev ~]# sar -u 3 5
- Linux 3.10.0-957.10.1.el7.x86_64 (odoodev) 2020年07月23日 _x86_64_ (4 CPU)
- 14时37分34秒 CPU %user %nice %system %iowait %steal %idle
- 14时37分37秒 all 0.25 0.00 0.17 0.00 0.00 99.58
- 14时37分40秒 all 0.17 0.00 0.08 0.00 0.00 99.75
- 14时37分43秒 all 0.25 0.00 0.08 0.00 0.00 99.67
- 14时37分46秒 all 0.25 0.00 0.17 0.08 0.00 99.50
- 14时37分49秒 all 0.33 0.08 0.42 0.00 0.00 99.16
- 平均时间: all 0.25 0.02 0.18 0.02 0.00 99.53
- [root@odoodev ~]#
对上面每项的输出解释如下:
%user列显示了用户进程消耗的CPU 时间百分比。
%nice列显示了运行正常进程所消耗的CPU 时间百分比。
%system列显示了系统进程消耗的CPU时间百分比。
%iowait列显示了IO等待所占用的CPU时间百分比
%steal列显示了在内存相对紧张的环境下pagein强制对不同的页面进行的steal操作 。
%idle列显示了CPU处在空闲状态的时间百分比。
3.内存性能评估
(1)利用free指令监控内存
- [root@odoodev ~]# free -m #查看以M为单位的内存使用情况
- total used free shared buff/cache available
- Mem: 32174 2029 24172 1869 5971 27814
- Swap: 6143 0 6143
- [root@odoodev ~]#
24172/32174=75%,说明内存资源很充足。
【经验公式】:应用程序可用内存/系统物理内存>70%时,表示系统内存资源非常充足,不影响系统性能,应用程序可用内存/系统物理内存<20%时,表示系统内存资源紧缺,需要增加系统内存,20%<应用程序可用内存/系统物理内存<70%时,表示系统内存资源基本能满足应用需求,暂时不影响系统性能。
(2)利用vmstat命令监控内存
- [root@odoodev ~]# vmstat 2 3
- procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
- r b swpd free buff cache si so bi bo in cs us sy id wa st
- 1 0 0 24762464 2120 6122280 0 0 0 6 1 3 1 0 99 0 0
- 0 0 0 24762612 2120 6122300 0 0 0 179 349 354 1 0 98 0 0
- 0 0 0 24762612 2120 6122320 0 0 0 0 314 307 1 0 98 0 0
- [root@odoodev ~]#
memory
swpd列表示切换到内存交换区的内存数量(以k为单位)。如果swpd的值不为0,或者比较大,只要si、so的值长期为0,这种情况下一般不用担心,不会影响系统性能。
free列表示当前空闲的物理内存数量(以k为单位)
buff列表示buffers cache的内存数量,一般对块设备的读写才需要缓冲。
cache列表示page cached的内存数量,一般作为文件系统cached,频繁访问的文件都会被cached,如果cache值较大,说明cached的文件数较多,如果此时IO中bi比较小,说明文件系统效率比较好。
swap
si列表示由磁盘调入内存,也就是内存进入内存交换区的数量。
so列表示由内存调入磁盘,也就是内存交换区进入内存的数量。
【经验总结】:一般情况下,si、so的值都为0,如果si、so的值长期不为0,则表示系统内存不足。需要增加系统内存。
4.磁盘I/O性能评估
(1)利用iostat评估磁盘性能
- [root@odoodev ~]# iostat -d 2 3 #-d 显示磁盘的使用情况
- Linux 3.10.0-957.10.1.el7.x86_64 (odoodev) 2020年07月23日 _x86_64_ (4 CPU)
- Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
- vda 2.10 0.48 25.19 1451558 76122344
- dm-0 1.79 0.47 25.18 1423879 76107735
- dm-1 0.00 0.00 0.00 2464 0
- dm-2 0.00 0.00 0.00 14500 12490
- Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
- vda 14.00 4.00 25.75 8 51
- dm-0 9.50 4.00 25.75 8 51
- dm-1 0.00 0.00 0.00 0 0
- dm-2 0.00 0.00 0.00 0 0
- Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
- vda 1.50 0.00 3.25 0 6
- dm-0 1.00 0.00 3.25 0 6
- dm-1 0.00 0.00 0.00 0 0
- dm-2 0.00 0.00 0.00 0 0
- [root@odoodev ~]#
对上面每项的输出解释如下:
Device: 以sdX形式显示的设备名称tps: 每秒进程下发的IO读、写请求数量KB_read/s: 每秒从驱动器读入的数据量,单位为K。KB_wrtn/s: 每秒从驱动器写入的数据量,单位为K。KB_read: 读入数据总量,单位为K。KB_wrtn: 写入数据总量,单位为K。
- 可以通过KB_read/s和KB_wrtn/s的值对磁盘的读写性能有一个基本的了解,如果KB_wrtn/s值很大,表示磁盘的写操作很频繁,可以考虑优化磁盘或者优化程序,如果KB_read/s值很大,表示磁盘直接读取操作很多,可以将读取的数据放入内存中进行操作。
- 对于这两个选项的值没有一个固定的大小,根据系统应用的不同,会有不同的值,但是有一个规则还是可以遵循的:长期的、超大的数据读写,肯定是不正常的,这种情况一定会影响系统性能。
(2)利用sar评估磁盘性能
通过“sar –d”组合,可以对系统的磁盘IO做一个基本的统计。
- [root@odoodev ~]# sar -d 2 3
- Linux 3.10.0-957.10.1.el7.x86_64 (odoodev) 2020年07月23日 _x86_64_ (4 CPU)
- 15时10分27秒 DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util
- 15时10分29秒 dev252-0 13.50 0.00 50.50 3.74 0.00 5.93 0.11 0.15
- 15时10分29秒 dev253-0 9.00 0.00 50.50 5.61 0.08 8.89 8.89 8.00
- 15时10分29秒 dev253-1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
- 15时10分29秒 dev253-2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
- 15时10分29秒 DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util
- 15时10分31秒 dev252-0 6.00 0.00 506.00 84.33 0.00 4.17 0.08 0.05
- 15时10分31秒 dev253-0 6.50 0.00 506.00 77.85 0.03 4.00 3.23 2.10
- 15时10分31秒 dev253-1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
- 15时10分31秒 dev253-2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
- 15时10分31秒 DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util
- 15时10分33秒 dev252-0 1.50 0.00 25.50 17.00 0.00 5.00 0.00 0.00
- 15时10分33秒 dev253-0 1.00 0.00 25.50 25.50 0.01 7.50 7.50 0.75
- 15时10分33秒 dev253-1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
- 15时10分33秒 dev253-2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
- 平均时间: DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util
- 平均时间: dev252-0 7.00 0.00 194.00 27.71 0.00 5.36 0.10 0.07
- 平均时间: dev253-0 5.50 0.00 194.00 35.27 0.04 6.88 6.58 3.62
- 平均时间: dev253-1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
- 平均时间: dev253-2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
- [root@odoodev ~]#
需要关注的几个参数含义:
await表示平均每次设备I/O操作的等待时间(以毫秒为单位)。
svctm表示平均每次设备I/O操作的服务时间(以毫秒为单位)。
%util表示一秒中有百分之几的时间用于I/O操作。
对以磁盘IO性能,一般有如下评判标准:
正常情况下svctm应该是小于await值的,而svctm的大小和磁盘性能有关,CPU、内存的负荷也会对svctm值造成影响,过多的请求也会间接的导致svctm值的增加。
await值的大小一般取决与svctm的值和I/O队列长度以及I/O请求模式,如果svctm的值与await很接近,表示几乎没有I/O等待,磁盘性能很好,如果await的值远高于svctm的值,则表示I/O队列等待太长,系统上运行的应用程序将变慢,此时可以通过更换更快的硬盘来解决问题。
%util项的值也是衡量磁盘I/O的一个重要指标,如果%util接近100%,表示磁盘产生的I/O请求太多,I/O系统已经满负荷的在工作,该磁盘可能存在瓶颈。长期下去,势必影响系统的性能,可以通过优化程序或者通过更换更高、更快的磁盘来解决此问题。
5.网络性能评估
- (1)通过ping命令检测网络的连通性
- (2)通过netstat –i组合检测网络接口状况
- (3)通过netstat –r组合检测系统的路由表信息
- (4)通过sar –n组合显示系统的网络运行状态 sar -n DEV 5 3
查看TCP连接数:
- [root@odoodev ~]# netstat -an|awk '/^tcp/{++S[$NF]}END{for (a in S)print a,S[a]}'
- LISTEN 17
- ESTABLISHED 3
- FIN_WAIT1 1
- TIME_WAIT 10
- SYN_SENT 6
- [root@odoodev ~]#
查看连接数最多的ip
- [root@odoodev ~]# netstat -pant |grep ":80"|awk '{print $5}' | awk -F: '{print $1}'|sort|uniq -c|sort -nr
- 8 123.183.158.11
- 2 5.255.86.129
- 2 107.191.99.221
- 2 0.0.0.0
- 1 45.9.148.129
- 1 45.9.148.117
- [root@odoodev ~]#
三、针对问题的常用改进措施
1.为磁盘I/O调整Linux内核电梯算法
在选择文件系统后,有一些内核和挂载选项可能会影响到它的性能表现,其中一个内核设置是电梯算法,通过调整电梯算法,系统可以平衡低延迟需求,收集足够的数据,以有效地组织对磁盘的读和写请求。
2.禁用不必要的守护进程,节省内存和CPU资源
每台服务器上都运行着许多守护进程或服务,而具有讽刺意味的是,有很多通常不是必需的,这些服务没有发挥作用,但却消耗了宝贵的内存和CPU时间。此外,它们可能将服务器置于危险境地,多运行一个服务就等于多向黑客打开一扇长驱直入的门,因此,你应该将它们从服务器移除,禁用它们最大的好处是可以加快启动时间,释放内存。另外,你可以减少CPU需要处理的进程数,禁用它们的另一个好处是增强服务器的安全性,因为越少的守护进程意味着可被攻击和利用的漏洞越少。
下面是一些应该被禁用的Linux守护进程,默认情况下,它们都是自动运行的:
序号 | 守护进程 | 描述 |
---|---|---|
1 | Apmd | 高级电源管理守护进程 |
2 | Nfslock | 用于NFS文件锁定 |
3 | Isdn | ISDN Moderm支持 |
4 | Autofs | 在后台自动挂载文件系统(如自动挂载CD-ROM) |
5 | Sendmail | 邮件传输代理 |
6 | Xfs | X Window的字体服务器 |
3.关掉GUI
一般说来,Linux服务器是不需要GUI的,所有管理任务都可以在命令行下完成,因此最好关掉GUI,重定向X显示或通过一个Web浏览器界面显示。为了禁用GUI,“init level(启动级别)”应该被设置为3(命令行登录),而不是5(图形登录),如果需要GUI,可以随时运行startx进入图形用户界面。
4.清理不需要的模块或功能
在服务器软件包中有太多被启动的功能或模块实际上是不需要的(如Apache中的许多功能模块),仔细查看Apache配置文件,确定FrontPage支持或其它额外的模块是否真的要用到,如果不需要,应该毫不犹豫地从服务器禁用掉,这样有助于提高系统内存可用量,腾出更多资源给那些真正需要的软件,让它们运行得更快。
5.修改磁盘缓存
Odoo 有大量的小文件,修改磁盘预读缓存可以显著 提高 odoo 访问速度
blockdev 工具允许从命令行调用区块设备控制程序。
–setro 设置设备为只读–getro 读取设备是否为只读(成功为1,0则为可读写)–setrw 设置设别为可读写–getss 打印设备的扇区大小,通常是512–getsize 打印设别的容量,按照一个扇区512个字节计算–setra N 设置预读扇区(512字节)为N个.Set readahead to N 512-byte sectors.–getra 打印readahead(预读扇区)–flushbufs 刷新缓冲–rereadpt 重读分区表。
blockdev --getra /dev/sda
默认值为256,建议的范围是在4096-16384之间,预读不足的常见问题是写磁盘的速度要比读取的速度要高。
改变参数的命令格式是:blockdev --setra 4096 /dev/xdva1
需要根据每块磁盘单独进行设置,通常可以将调整命令写入rc.local启动脚本中。
6.禁用文件写操作
在linux中,用户每访问一个文件,系统都会更新文件的其中一个属性(上次访问时间),当用户在访问数据时,系统会需要不断的进行写操作,这个在系统中也是一笔不小的开销,我们可以在/etc/fstab文件中,对挂载的卷加上noatime选项来禁用此行为:
- /dev/sda1 / ext3 noatime,errors=remount-ro 0 1
修改完以后,执行sudo mount -a 命令生效即可。
7.读缓存与交换参数修改
在linux中有关读缓存与交换的参数如下有两个,可以在/etc/sysctl.conf中加上两行:
- vm.swappiness=0
- vm.overcommit_memory=2
这些参数可以在/proc/sys/vm/中查看。
8.共享内存的设定
系统中共享内存的默认值都很低,为了更好的利用服务器资源,我们将对其进行调整,网上有一个调整的脚本。
- #!/bin/bash
- page_size=`getconf PAGE_SIZE`
- phys_pages=`getconf _PHYS_PAGES`
- shmall=`expr $phys_pages / 2`
- shmmax=`expr $shmall \* $page_size`
- echo kernel.shmmax = $shmmax
- echo kernel.shmall = $shmall
直接以root身份运行 ./shmsetup >> /etc/sysctl.conf
sysctl -p
9.日志文件转移到内存
当一台机器处于运行中时,最好是将系统日志放在内存中,当系统关闭时再将其复制到硬盘,当你运行一台开启了syslog功能的笔记本电脑或移动设备时,ramlog可以帮助你提高系统电池或移动设备闪存驱动器的寿命,使用ramlog的一个好处是,不用再担心某个守护进程每隔30秒向syslog发送一条消息,放在以前,硬盘必须随时保持运转,这样对硬盘和电池都不好。
10.先打包,后写入
在内存中划分出固定大小的空间保存日志文件,这意味着笔记本电脑硬盘不用一直保持运转,只有当某个守护进程需要写入日志时才运转,注意ramlog使用的内存空间大小是固定的,否则系统内存会很快被用光,如果笔记本使用固态硬盘,可以分配50-80MB内存给ramlog使用,ramlog可以减少许多写入周期,极大地提高固态硬盘的使用寿命。