zabbix之生产配置

操作系统配置

场景

这个服务器经常报DISK IO IS OVERLOAD
经top和iotop排查是磁盘过载问题,iotop查看有jdb2和flush进程占用IO过高,调整后报警消失。
其作用的配置主要有两个
一个是磁盘配置参数(针对jdb2)
一个是系统缓存配置(针对flush进程)
详情见下文。

内核配置

cat /etc/sysctl.conf 
# Kernel sysctl configuration file for Red Hat Linux
#
# For binary values, 0 is disabled, 1 is enabled.  See sysctl(8) and
# sysctl.conf(5) for more details.
#
# Use '/sbin/sysctl -a' to list all possible parameters.

# Controls IP packet forwarding
net.ipv4.ip_forward = 1

# Controls source route verification
net.ipv4.conf.default.rp_filter = 1

# Do not accept source routing
net.ipv4.conf.default.accept_source_route = 0

# Controls the System Request debugging functionality of the kernel
kernel.sysrq = 0

# Controls whether core dumps will append the PID to the core filename.
# Useful for debugging multi-threaded applications.
kernel.core_uses_pid = 1

# Controls the use of TCP syncookies
net.ipv4.tcp_syncookies = 1

# Controls the default maxmimum size of a mesage queue
kernel.msgmnb = 65536

# Controls the maximum size of a message, in bytes
kernel.msgmax = 65536

# Controls the maximum shared segment size, in bytes
kernel.shmmax = 68719476736

# Controls the maximum number of shared memory segments, in pages
kernel.shmall = 4294967296
vm.swappiness=0
vm.dirty_background_ratio = 5
vm.dirty_ratio = 30
vm.swappiness=0
dev.raid.speed_limit_max=500000
net.core.somaxconn=65535
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_max_orphans = 8192
net.core.netdev_max_backlog = 2000
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_keepalive_time = 1800
# tcp连接保持时间为1800秒
# net.ipv4.tcp_keepalive_time = 1800
# # 回收TIME_WAIT占用的连接 
net.ipv4.tcp_tw_recycle = 1
vm.swappiness = 0
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 5
net.nf_conntrack_max = 26144
net.netfilter.nf_conntrack_max = 26144

系统缓存配置

echo 1 > /proc/sys/vm/dirty_background_ratio
echo 5 > /proc/sys/vm/dirty_ratio

降低文件系统缓存大小的方法,其中一种是通过修改/proc/sys/vm/dirty_background_ration以及/proc/sys/vm/dirty_ratio两个参数的大小来实现。
vm.dirty_background_ratio:这个参数指定了当文件系统缓存脏页数量达到系统内存百分之多少时(如5%)就会触发pdflush/flush/kdmflush等后台回写进程运行,将一定缓存的脏页异步地刷入外存;

vm.dirty_ratio:而这个参数则指定了当文件系统缓存脏页数量达到系统内存百分之多少时(如10%),系统不得不开始处理缓存脏页(因为此时脏页数量已经比较多,为了避免数据丢失需要将一定脏页刷入外存);在此过程中很多应用进程可能会因为系统转而处理文件IO而阻塞。

之前一直错误的一位dirty_ratio的触发条件不可能达到,因为每次肯定会先达到vm.dirty_background_ratio的条件,后来才知道自己理解错了。确实是先达到vm.dirty_background_ratio的条件然后触发flush进程进行异步的回写操作,但是这一过程中应用进程仍然可以进行写操作,如果多个应用进程写入的量大于flush进程刷出的量那自然会达到vm.dirty_ratio这个参数所设定的坎,此时操作系统会转入同步地处理脏页的过程,阻塞应用进程。

MySQL配置

cat /etc/my.cnf
[mysqld]
#innodb_flush_log_at_trx_commit = 2
#sync_binlog=10
#wait_timeout=300
#innodb_flush_method=O_DIRECT
#innodb_thread_concurrency = 0

#read_rnd_buffer_size = 64M
#innodb_buffer_pool_size=10G

#binlog_cache_size=500M
#innodb_max_dirty_pages_pct=90

#read_buffer_size=256M
#sort_buffer_size=256M
#query_cache_size = 256M
#query_cache_limit = 8M

#thread_cache_size=500M
#max_heap_table_size=10G
#tmp_table_size=10G

back_log=500
interactive_timeout=1800
thread_concurrency=16
skip-name-resolve
key_buffer_size=500M


slow_query_log = ON
slow_query_log_file = /var/lib/mysql/slow.log
long_query_time = 1

datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql

symbolic-links=0
max_connections=3000
default-storage-engine=INNODB
character-set-server=utf8
collation-server=utf8_general_ci


net_buffer_length=256k
max_allowed_packet=100M
thread_stack = 256K
table_cache = 128K
read_buffer_size = 4M
#读查询操作所能使用的缓冲区大小。和sort_buffer_size一样,该参数对应的分配内存也是每连接独享。
join_buffer_size = 8M
#联合查询操作所能使用的缓冲区大小,和sort_buffer_size一样,该参数对应的分配内存也是每连接独享。
#myisam_sort_buffer_size = 64M
table_cache = 512
thread_cache_size = 64
query_cache_size = 64M
tmp_table_size = 256M
max_connections = 768
#指定MySQL允许的最大连接进程数。如果在访问论坛时经常出现Too Many Connections的错误提 示,则需要增大该参数值。
#max_connect_errors = 10000000
wait_timeout = 10
#指定一个请求的最大连接时间,对于4GB左右内存的服务器可以设置为5-10。
thread_concurrency = 16
#该参数取值为服务器逻辑CPU数量*2,在本例中,服务器有2颗物理CPU,而每颗物理CPU又支持H.T超线程,所以实际取值为4*2=8
#skip-networking
table_cache=1024
#物理内存越大,设置就越大.默认为2402,调到512-1024最佳
innodb_additional_mem_pool_size=100M
#默认为2M
innodb_flush_log_at_trx_commit=1
#设置为0就是等到innodb_log_buffer_size列队满后再统一储存,默认为1
innodb_log_buffer_size=20M
read_buffer_size=4M
#默认为64K
read_rnd_buffer_size=16M
#默认为256K
sort_buffer_size=32M
#默认为256K
thread_cache_size=120
#默认为60
query_cache_size=32M
innodb_buffer_pool_size=5120M
#这对Innodb表来说非常重要。Innodb相比MyISAM表对缓冲更为敏感。MyISAM可以在默认的 key_buffer_size 设置下运行的
#可以,然而Innodb在默认的 innodb_buffer_pool_size 设置下却跟蜗牛似的。由于Innodb把数据和索引都缓存起来,无需留给操作系统太多的内存,因此如果只需要用Innodb的话则可以设置它高达 70-80% 的可用内存。一些应用于 key_buffer 的规则有 — 如果你的数据量不大,并且不会暴增,那么无需把 innodb_buffer_pool_size 设置的太大了。
#innodb_additional_pool_size – 这个选项对性能影响并不太多,至少在有差不多足够内存可分配的操作系统上是这样。不过如果你仍然想设置为 20MB(或者更大),因此就需要看一下Innodb其他需要分配的内存有多少。
innodb_log_file_size=512M 
#在高写入负载尤其是大数据集的情况下很重要。这个值越大则性能相对越高,但是要注意到可能会增加恢复时间。我经常设置为64-512MB,跟据服务器大小而异。
#innodb_log_buffer_size 默 认的设置在中等强度写入负载以及较短事务的情况下,服务器性能还可 以。如果存在更新操作峰值或者负载较大,就应该考虑加大它的值了。如果它的值设置太高了,可能会浪费内存 — 它每秒都会刷新一次,因此无需设置超过1秒所需的内存空间。通常 8-16MB 就足够了。

#innodb刷新的方式,影响innodb读取数据的方式O_DIRECT 为Linux的最好选择
innodb_flush_method = O_DIRECT
#控制innodb如何使用表空间,为1表示为每个表建立单独的表空间,为0表示使用系统表空间,强烈建议设置为1
innodb_file_per_table = 1


[client]
default-character-set=utf8

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
[root@zabbix ~]# vim /etc/my.cnf
[root@zabbix ~]# cat /etc/my.cnf
[mysqld]
#innodb_flush_log_at_trx_commit = 2
#sync_binlog=10
#wait_timeout=300
#innodb_flush_method=O_DIRECT
#innodb_thread_concurrency = 0

#read_rnd_buffer_size = 64M
#innodb_buffer_pool_size=10G

#binlog_cache_size=500M
#innodb_max_dirty_pages_pct=90

#read_buffer_size=256M
#sort_buffer_size=256M
#query_cache_size = 256M
#query_cache_limit = 8M

#thread_cache_size=500M
#max_heap_table_size=10G
#tmp_table_size=10G

back_log=500
interactive_timeout=1800
thread_concurrency=16
skip-name-resolve
key_buffer_size=500M


slow_query_log = ON
slow_query_log_file = /var/lib/mysql/slow.log
long_query_time = 1

datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql

symbolic-links=0
max_connections=3000
default-storage-engine=INNODB
character-set-server=utf8
collation-server=utf8_general_ci


net_buffer_length=256k
max_allowed_packet=100M
thread_stack = 256K
table_cache = 128K
#读查询操作所能使用的缓冲区大小。和sort_buffer_size一样,该参数对应的分配内存也是每连接独享。
read_buffer_size = 4M
#联合查询操作所能使用的缓冲区大小,和sort_buffer_size一样,该参数对应的分配内存也是每连接独享。
join_buffer_size = 8M
#myisam_sort_buffer_size = 64M
table_cache = 512
thread_cache_size = 64
query_cache_size = 64M
tmp_table_size = 256M
#指定MySQL允许的最大连接进程数。如果在访问论坛时经常出现Too Many Connections的错误提 示,则需要增大该参数值。
max_connections = 768
#max_connect_errors = 10000000
#指定一个请求的最大连接时间,对于4GB左右内存的服务器可以设置为5-10。
wait_timeout = 10
#该参数取值为服务器逻辑CPU数量*2,在本例中,服务器有2颗物理CPU,而每颗物理CPU又支持H.T超线程,所以实际取值为4*2=8
thread_concurrency = 16
#skip-networking
#物理内存越大,设置就越大.默认为2402,调到512-1024最佳
table_cache=1024
#默认为2M
innodb_additional_mem_pool_size=100M
#设置为0就是等到innodb_log_buffer_size列队满后再统一储存,默认为1
innodb_flush_log_at_trx_commit=1
innodb_log_buffer_size=20M
#默认为64K
read_buffer_size=4M
#默认为256K
read_rnd_buffer_size=16M
#默认为256K
sort_buffer_size=32M
#默认为60
thread_cache_size=120
query_cache_size=32M
#这对Innodb表来说非常重要。Innodb相比MyISAM表对缓冲更为敏感。MyISAM可以在默认的 key_buffer_size 设置下运行的
#可以,然而Innodb在默认的 innodb_buffer_pool_size 设置下却跟蜗牛似的。由于Innodb把数据和索引都缓存起来,无需留给操作系统太多的内存,因此如果只需要用Innodb的话则可以设置它高达 70-80% 的可用内存。一些应用于 key_buffer 的规则有 — 如果你的数据量不大,并且不会暴增,那么无需把 innodb_buffer_pool_size 设置的太大了。
innodb_buffer_pool_size=5120M
#innodb_additional_pool_size – 这个选项对性能影响并不太多,至少在有差不多足够内存可分配的操作系统上是这样。不过如果你仍然想设置为 20MB(或者更大),因此就需要看一下Innodb其他需要分配的内存有多少。
#在高写入负载尤其是大数据集的情况下很重要。这个值越大则性能相对越高,但是要注意到可能会增加恢复时间。我经常设置为64-512MB,跟据服务器大小而异。
#innodb_log_buffer_size 默 认的设置在中等强度写入负载以及较短事务的情况下,服务器性能还可 以。如果存在更新操作峰值或者负载较大,就应该考虑加大它的值了。如果它的值设置太高了,可能会浪费内存 — 它每秒都会刷新一次,因此无需设置超过1秒所需的内存空间。通常 8-16MB 就足够了。
innodb_log_file_size=512M 

#innodb刷新的方式,影响innodb读取数据的方式O_DIRECT 为Linux的最好选择
innodb_flush_method = O_DIRECT
#控制innodb如何使用表空间,为1表示为每个表建立单独的表空间,为0表示使用系统表空间,强烈建议设置为1
innodb_file_per_table = 1


[client]
default-character-set=utf8

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

zabbix配置

egrep -v '^#|^$' /etc/zabbix_server.conf
LogFile=/tmp/zabbix_server.log
DBName=zabbix
DBUser=zabbix
DBPassword=zabbix
StartPollers=100
StartPollersUnreachable=10
StartTrappers=100
StartSNMPTrapper=1
HousekeepingFrequency=1
CacheSize=1024M
CacheUpdateFrequency=60
StartDBSyncers=30
HistoryCacheSize=512M
HistoryIndexCacheSize=128M
TrendCacheSize=128M
ValueCacheSize=256M
Timeout=30
AlertScriptsPath=/usr/local/zabbix/share/zabbix/alertscripts
LogSlowQueries=3000

磁盘配置

cat /etc/fstab 

#
# /etc/fstab
# Created by anaconda on Wed Sep  6 09:19:40 2017
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=6420f6a9-36f5-4d6a-ad26-d6016a2f7fdf /                       ext4    defaults,noatime,nodiratime,barrier=0,data=writeback,commit=60        0 1
UUID=91eb25c7-cea4-4b78-ac23-06769bb3d68d /boot                   ext4    defaults        1 2
UUID=C630-DED8          /boot/efi               vfat    umask=0077,shortname=winnt 0 0
#UUID=e411d52e-6509-46f3-9341-38183e1b97a8 swap                    swap    defaults        0 0
tmpfs                   /dev/shm                tmpfs   defaults        0 0
devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
sysfs                   /sys                    sysfs   defaults        0 0
proc                    /proc                   proc    defaults        0 0

说明:UUID=6420f6a9-36f5-4d6a-ad26-d6016a2f7fdf磁盘为数据库和zabbix要操作的磁盘。
磁盘挂载参数解释:

1、data=日志模式
ext4有3种日志模式,分别是ordered,writeback,journal。他们的差别网上有很多资料,我简单介绍下:

jorunal:把元数据与数据一并写入到日志块。性能差不多折半,因为数据写了两次,但最安全

writeback: 把元数据写入日志块,数据不写入日志块,但不保证数据先落盘。性能最高,但由于不保证元数据与数据的顺序,也是掉电最不安全的

ordered:与writeback相似,但会保证数据先落盘,再是元数据。折中性能以保证足够的安全,这是大多数PC上推荐的默认的模式

在不需要担心掉电的服务器环境,我们完全可以使用writeback的日志模式,以获取最高的性能。

2、noatime,nodiratime
默认的方式下linux会把文件访问的时间atime做记录,文件系统在文件被访问、创建、修改等的时候记录下了文件的一些时间戳,比如:文件创建时间、最近一次修改时间和最近一次访问时间;这在绝大部分的场合都是没有必要的。
因为系统运行的时候要访问大量文件,如果能减少一些动作(比如减少时间戳的记录次数等)将会显著提高磁盘 IO 的效率、提升文件系统的性能。
如果遇到机器IO负载高或是CPU WAIT高的情况,可以尝试使用noatime和nodiratime禁止记录最近一次访问时间戳。

3、barrier
要理解barrier,你首先需要理解文件系统日志功能。常用的文件系统使用日志功能来保证文件系统的完整性。该功能背后的思路很简单:在写入新的数据块到磁盘之前,会先将元数据写入日志。预先将元数据写入日志可以保证在写入真实数据前后一旦发生错误,日志功能能很容易地回滚到更改之前的状态。这个方法确保了不会发生文件系统崩溃的情况。

单独使用日志功能不能保证没有任何差错。现在的磁盘大都有大容量的缓存,数据不会立即写入到磁盘中,而是先写入到磁盘缓存中。到这一步,磁盘控制器就能更加高效地将其复制到磁盘中。这对性能来说是有好处的,但是对日志功能来说则相反。为了保证日志百分之百可靠,它必须绝对保证元数据在真实数据写入之前被预先写入。这就是我们要介绍文件系统barrier的原因。
如果你希望得到更好的 系统性能,最好也不要开启barrier功能,它会降低系统运行速度。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

时空无限

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值