1. 一、系统级内核参数配置
# 禁止ip转发功能
# 0表示不开启,为1表示开启,建议不开始。如果将Linux系统作为路由或者VPN服务就必须要开启IP转发功能。
net.ipv4.ip_forward = 0
#开启对数据包源地址的校验
#开启rp_filter参数的作用
#1. 减少DDoS攻击
#校验数据包的反向路径,如果反向路径不合适,则直接丢弃数据包,避免过多的无效连接消耗系统资源。
#2. 防止IP Spoofing
#校验数据包的反向路径,如果客户端伪造的源IP地址对应的反向路径不在路由表中,或者反向路 #径不是最佳路径,则直接丢弃数据包,不会向伪造IP的客户端回复响应。
net.ipv4.conf.default.rp_filter = 1
#禁用所有IP源路由
net.ipv4.conf.default.accept_source_route = 0
#控制core文件的文件名是否添加pid作为扩展
kernel.core_uses_pid = 1
#每个消息队列的大小(单位:字节)限制
kernel.msgmnb = 65536
#每个消息队列的大小(单位:字节)限制
kernel.msgmax = 65536
#单个共享内存段的大小(单位:字节)限制,计算公式64G*1024*1024*1024(字节)
kernel.shmmax = 68719476736
#所有内存大小(单位:页,1页 = 4Kb),计算公式16G*1024*1024*1024/4KB(页)
kernel.shmall = 4294967296
#这个参数指定了当文件系统缓存脏页数量达到系统内存百分之多少时(如5%)就会触发pdflush/flush/kdmflush等后台回写进程运行,将一定缓存的脏页异步地刷入外存
vm.dirty_background_ratio = 5
#将vm.dirty_background_ratio设置为5-10,将vm.dirty_ratio设置为它的两倍左右,以确保能持续将脏数据刷新到磁盘,
#避免瞬间I/O写,产生严重等待(和MySQL中的innodb_max_dirty_pages_pct类似)
vm.dirty_ratio = 10
#估计这个用处不太,因为80/443端口已不追踪
net.netfilter.nf_conntrack_max = 3276800
#用于设置时间戳,赋值为0意味着禁用TCP时间戳的支持。
net.ipv4.tcp_timestamps = 0
#表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;
net.ipv4.tcp_syncookies = 1
#表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;
net.ipv4.tcp_tw_reuse = 1
#表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭;
net.ipv4.tcp_tw_recycle = 1
#表示用于向外连接的端口范围。缺省情况下很小:32768到61000,改为4096到65000。(注意:这里不要将最低值设的太低,否则可能会占用掉正常的端口!)
net.ipv4.ip_local_port_range = 4096 65000
#表示系统同时保持TIME_WAIT的最大数量,如果超过这个数字,TIME_WAIT将立刻被清除并打印警告信息。默 认为180000,改为6000。
#对于Apache、Nginx等服务器,上几行的参数可以很好地减少TIME_WAIT套接字数量,但是对于 Squid,效果却不大。
#此项参数可以控制TIME_WAIT的最大数量,避免Squid服务器被大量的TIME_WAIT拖死。
net.ipv4.tcp_max_tw_buckets = 55000
#表示当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时,改为30秒
net.ipv4.tcp_keepalive_time=30
#孤儿socket废弃前重试的次数,重负载web服务器建议调小
#设置较小的数值,可以有效降低orphans的数量(net.ipv4.tcp_orphan_retries = 0并不是想像中的不重试
net.ipv4.tcp_orphan_retries=1
#表示如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间
net.ipv4.tcp_fin_timeout = 10
##减少超时前的探测次数
net.ipv4.tcp_keepalive_probes=3
#表示SYN队列的长度,默认为1024,加大队列长度为65536,可以容纳更多等待连接的网络连接数。
net.ipv4.tcp_max_syn_backlog = 65536
#该参数用于设置内核放弃TCP连接之前向客户端发送SYN+ACK包的数量。为了建立对端的连接服务,服务器和客户端需要进行三次握手,第二次握手期间,
#内核需要发送SYN并附带一个回应前一个SYN的ACK,一个参数主要影响这个过程,一般赋值为1,即内核放弃连接之前发送一次SYN+ACK包,可以设置其为:
net.ipv4.tcp_synack_retries = 1
#该参数的作用与上一个参数类似,设置内核放弃建立连接之前发送SYN包的数量,他的赋值和上个参数一样即可:
net.ipv4.tcp_syn_retries = 1
#系统所能处理不属于任何进程的TCP sockets最大数量。假如超过这个数量,那么不属于任何进程的连接会被立即reset,并同时显示警告信息。
#之所以要设定这个限制﹐纯粹为了抵御那些简单的 DoS 攻击﹐千万不要依赖这个或是人为的降低这个限制,更应该增加这个值(如果增加了内存之后)。
#每个孤儿套接字最多能够吃掉你64K不可交换的内存。
#这个最好不要修改,因为每增加1,将消耗~64k内存。即使报错 TCP: too many of orphaned sockets 也有可能是由于你的net.ipv4.tcp_mem过小,
#导致的Out of socket memory,继而引发的。
net.ipv4.tcp_max_orphans = 3276800
#TCP共享内容
#net.ipv4.tcp_mem[0]: 低于此值,TCP没有内存压力.
#net.ipv4.tcp_mem[1]: 在此值下,进入内存压力阶段.
#net.ipv4.tcp_mem[2]: 高于此值,TCP拒绝分配socket.
net.ipv4.tcp_mem = 94500000 915000000 927000000
#限制了接收新 TCP 连接侦听队列的大小。对于一个经常处理新连接的高负载 web服务环境来说,默认的 128 太小了。
#设置超过65535就会产生: “sysctl: setting key ‘net.core.somaxconn’: 无效的参数” 错误
net.core.somaxconn = 65535
#表示当每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许发送到队列的数据包的最大数目,一般默认值为128(可能不同的linux系统该数值也不同)。nginx服务器中定义的NGX_LISTEN_BACKLOG默认为511。我们可以将它调整一下:
net.core.netdev_max_backlog = 1048576
#内核可以打开的最大的文件句柄数
fs.file-max = 819200
#发送套接字缓冲区大小的默认值(以字节为单位)。
net.core.wmem_default = 8388608
#接收套接字缓冲区大小的最大值(以字节为单位)。
net.core.rmem_max = 1024123000
#接收套接字缓冲区大小的默认值(以字节为单位)。
net.core.rmem_default = 8388608
#发送套接字缓冲区大小的最大值(以字节为单位)。
net.core.wmem_max = 16777216
#控制台日志级别:优先级高于该值得消息将被打印到到控制台
kernel.printk = 5
#它可以在系统出现故障的时候协助恢复和调试系统。只要你的虚拟终端或串口还可以接收键盘输入(系统还能响应键盘的按键中断),
#SysRq就可用,你可以借助它来查看当时的内存、进程状态等信息,而不是直接强行拔掉电源重启系统。
上述配置通过:sysctl -p 使配置生效
2. 二、mysql系统配置my.cnf
[mysqld]
#客户端和服务器将不会进行字符集握手。这可能会导致使用默认字符集
character-set-client-handshake = FALSE
#置服务器使用的默认字符集和校对规则
init_connect=’SET NAMES utf8mb4′
collation-server=utf8mb4_unicode_ci
character-set-server=utf8mb4
#STRICT_TRANS_TABLES: 对于事务表,如果一个列不能接受 NULL 值,而你没有为它提供值,MySQL #将返回一个错误。对于非事务表,它不会插入或更新记录。
#NO_ZERO_IN_DATE: 禁止日期中的月份和天数为0。例如,’0000-00-00′ 和 ‘2023-00-00’ 是非法的。
#NO_ZERO_DATE: 禁止日期中的年份为0。例如,’0000-01-01′ 是非法的。
#ERROR_FOR_DIVISION_BY_ZERO: 如果一个数字被零除,MySQL 将返回一个错误而不是返回 NULL。
#NO_AUTO_CREATE_USER: 禁止自动创建具有 DROP USER 权限的用户。
#NO_ENGINE_SUBSTITUTION: 如果请求的存储引擎不可用,MySQL 将不尝试使用另一个存储引擎替代并返回一个错误。
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
datadir=mysqlPath
socket=mysqlPath/mysql.sock
port=3306
#会使用外部锁定机制来管理并发访问
skip-external-locking
#定了用于 MyISAM 表索引的内存缓冲区的大小。
key_buffer_size = 256M
#设置客户端和服务器之间通信时可以发送的最大数据包大小。
max_allowed_packet = 16M
#指定服务器可以缓存打开的表的数量
table_open_cache = 2048
#指定每个线程用于排序操作的前缓冲区的大小。
sort_buffer_size = 2M
#指定每个线程用于单次读取操作的缓冲区大小
read_buffer_size = 2M
#指定每个线程用于随机读取操作的缓冲区大小
read_rnd_buffer_size = 8M
#指定 MyISAM 表排序操作时使用的缓冲区大小
myisam_sort_buffer_size = 64M
#指定线程缓存的连接数
thread_cache_size = 64
#用于指定查询缓存的大小。查询缓存用于存储 SELECT 语句和对应的结果,查询缓存需要被启用query_cache_type = 1
query_cache_size= 256M
#从服务器会记录其从主服务器复制的二进制日志事件。
log-slave-updates
#允许在从服务器上跳过复制过程中的特定错误
slave-skip-errors=all
#开启二进制日志(binary log)的同步方式,表示每写入一个日志事件就同步到磁盘。
sync_binlog=1
#配置自动递增属性的参数。
auto_increment_increment=2
#配置自动递增属性的另一个参数,在同一个服务器实例上生成不同的自动递增 ID 值
auto_increment_offset=1
#二进制日志(binary log)自动删除的天数(如果开启二进制日志,需要指定二进制文件保留日期)
expire_logs_days = 15
#启用二进制日志的配置选项
log-bin=mysql-bin
#配置二进制日志格式的参数
binlog_format=mixed
#在主从复制中,每个服务器需要有一个唯一的 ID
server-id = 1
#配置 InnoDB 存储引擎缓冲池大小的参数。InnoDB 缓冲池用于缓存数据和索引,是 InnoDB 性能优化的关键部分
innodb_buffer_pool_size = 4094M
#配置 InnoDB 存储引擎日志文件大小
innodb_log_file_size = 256M
#在日志文件组中创建两个日志文件
innodb_log_files_in_group = 2
#0:每秒写入并同步日志一次,事务提交时只写入日志到内存中,不立即同步到磁盘。
#1:每次事务提交时都写入并同步日志到磁盘。这是最安全的设置,但可能影响性能。
#2:每次事务提交时只写入日志到内存中,每秒同步一次日志到磁盘。
innodb_flush_log_at_trx_commit = 1
#设定的时间内无法获取到锁,将会被终止并返回一个错误。
innodb_lock_wait_timeout = 50
#用于缓存日志数据的缓冲区的大小。这个缓冲区主要用于写入重做日志
innodb_log_buffer_size = 16M
#决定了每个 InnoDB 表是否使用单独的表空间文件。0为共享,1为每个表单独使用一个表空间
innodb_file_per_table = 1
#指定数据库服务器同时接受的最大客户端连接数的参数
max_connections = 1024
#0:表名存储为给定的大小写,并且比较是大小写敏感的
#1:表名存储为小写,并且比较是不区分大小写的。
lower_case_table_names = 1
#用于控制是否允许没有 SUPER 权限的用户创建或修改存储函数,并使这些函数可用于二进制日志。
log_bin_trust_function_creators = 1
#设置为 InnoDB 可以提供更好的事务支持、行级锁定和外键约束等特性。
default-storage-engine=INNODB
#用于控制是否允许符号链接(symlinks)在 MySQL 数据目录中使用。最好开启,防止SQL注入
symbolic-links=0
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
[client]
default-character-set=utf8mb4
socket=/var/lib/mysql/mysql.sock
port=3306
[mysqldump]
quick
max_allowed_packet = 16M
[mysql]
default-character-set=utf8mb4
no-auto-rehash
[myisamchk]
key_buffer_size = 128M
sort_buffer_size = 2M
read_buffer = 2M
write_buffer = 2M
[mysqlhotcopy]
interactive-timeout
3. 三、Redis优化配置
############ GENERAL ################
daemonize yes
pidfile “redisPath/logs/redis-6380.pid”
port 6380
tcp-backlog 511 #当客户端的连接请求速度超过了Redis服务的处理速度时,放入队列中等待处理,不能超过/proc/sys/net/core/somaxconn
bind 0.0.0.0
timeout 0
tcp-keepalive 60
loglevel notice
logfile “redisPath/logs/redis-6380.log”
databases 16
############ SNAPSHOTTING ################
save 900 1
save 60 10000
stop-writes-on-bgsave-error yes #BGSAVE 操作失败时,Redis 将停止接收写操作。有助于数据同步,但可能会影响可用性
rdbcompression yes #决定了是否在存储快照时对数据进行压缩
rdbchecksum yes
dbfilename “dump-6380.rdb”
dir “redisPath/data”
############ REPLICATION ################
masterauth “xuanwu-T3st*17”
#slaveof 172.172.32.85 6380 #(从节点需要配置多此项)
slave-serve-stale-data yes #当从服务器与主服务器失去连接或者复制正在进行时,从服务器会继续响应客户端的请求。这意味着即使数据可能已经过时,从服务器仍然会返回旧数据给客户端。
slave-read-only yes
repl-diskless-sync no #no 从服务器将从主服务器的磁盘上读取数据。这意味着复制操作可能会受到磁盘I/O的限制
repl-diskless-sync-delay 5 #从服务器会等待主服务器完成对磁盘的写入操作后再开始同步,等待5s
repl-disable-tcp-nodelay no #主节点可以合并TCP包,以减少带宽的使用。
slave-priority 100 #主服务器宕机时,哪个从服务器会被提升为新的主服务器。优先级越高的从服务器越有可能被选为新的主服务器。
# min-slaves-to-write 3 #当主服务器要写入数据时,需要有多少个健康的从服务器存活才能执行写操作。
# min-slaves-max-lag 10 #主服务器会检查从服务器的延迟。如果从服务器的延迟超过了该值,主服务器将禁止写入操作,以避免数据丢失。
############ SECURITY ################
requirepass “xuanwu-T3st*17”
############ LIMITS ################
# maxclients 10000
maxmemory 4gb
maxmemory-policy volatile-lru #当 Redis 使用的内存量超过 maxmemory 的限制时,Redis将优先释放带有过期时间的键值对。如果带有过期时间的键值对不足以释放足够的内存,Redis 将继续释放不带过期时间的键值对。
############ APPEND ONLY MODE ################
appendonly yes #是否开启 AOF(Append Only File)持久化功能
appendfilename “appendonly-6380.aof”
appendfsync everysec #每秒钟同步一次 AOF 文件。
no-appendfsync-on-rewrite no #进行 AOF 重写时是否开启同步操作。
auto-aof-rewrite-percentage 80 #当 AOF 文件的大小比上一次 AOF 重写后的大小大 80% 时,将自动触发 AOF 重写
auto-aof-rewrite-min-size 128mb #不会对小于该值的 AOF 文件进行自动重写。
aof-load-truncated yes #当 AOF 文件出现截断错误时,是否允许 Redis 加载 AOF 文件。
############ LUA SCRIPTING ################
lua-time-limit 5000 #用于设置 Lua 脚本执行的超时时间
############ REDIS CLUSTER ################
# cluster-enabled yes #是否开启 Redis 集群模式。
# cluster-node-timeout 15000 #节点超时时间。
# cluster-slave-validity-factor 10 #从节点将根据主节点发送的写命令和实际数据变更情况,计算一个有效性分数。如果这个分数低于 10,从节点将被标记为无效。
# cluster-migration-barrier 1 #如果要进行数据迁移,除了原节点宕机外,还需要至少有 cluster-migration-barrier 个正常工作的节点。
# cluster-require-full-coverage yes #表示在进行写操作时,必须确保所涉及的(全部键值)数据存在于 Redis 集群中。
############ SLOW LOG ################
slowlog-log-slower-than 10000 #10000 微秒(10毫秒)。这意味着,如果查询的执行时间超过了 10 毫秒,Redis 将记录该查询的日志。
slowlog-max-len 128 #于设置慢查询日志的最大长度。慢查询日志的最大长度为 128 条记录
############ LATENCY MONITOR ################
latency-monitor-threshold 0 #表示不开启延迟监控功能。当某个操作的延迟超过这个阈值时,Redis 将记录该操作的日志,并输出相关信息。
############ EVENT NOTIFICATION ################
notify-keyspace-events “Ex” #只关注键空间事件中的过期事件(EX事件)。当一个键过期时,Redis 将发送键空间通知给订阅的客户端。ICC有状态报告过期时间,必须开启
3.1.1.1.1.1. ###### ADVANCED CONFIG ################
hash-max-ziplist-entries 512 #设置哈希类型键的最大 ziplist 入口数。
hash-max-ziplist-value 64 #设置哈希类型键中 ziplist 值的最大字节数
list-max-ziplist-entries 512 #设置列表类型键的最大 ziplist 入口数。
list-max-ziplist-value 64
set-max-intset-entries 512 #设置集合类型键的最大整数集合元素数
zset-max-ziplist-entries 128
zset-max-ziplist-value 64 #设置有序集合(ZSet)中 ziplist 类型的值的最大字节数
hll-sparse-max-bytes 3000 #设置稀疏编码的最大字节数。
activerehashing yes #是否开启主动 rehashing。主动 rehashing 是 Redis 为了提高哈希表的性能而采取的一种策略。
client-output-buffer-limit normal 0 0 0 #限制客户端输出缓冲区的最大大小。这里表示不限制
client-output-buffer-limit slave 256mb 64mb 60 #从服务器(slave)的客户端输出缓冲区,限制其最大大小为 256MB,如果超过这个大小,则将输出缓冲区的大小减少到 64MB,如果超过 64MB 且持续时间超过 60 秒,则断开与该客户端的连接。
client-output-buffer-limit pubsub 32mb 8mb 60 #对于发布/订阅模式的客户端,限制其输出缓冲区的最大大小为 32MB,如果超过这个大小,则将输出缓冲区的大小减少到 8MB,如果超过 8MB 且持续时间超过 60 秒,则断开与该客户端的连接。
hz 10 #表示 Redis 主线程每秒钟检查执行后台任务的频率。默认情况下,hz 的值为 10,表示 Redis 主线程每秒钟检查执行后台任务 10 次。
aof-rewrite-incremental-fsync yes #在 AOF 重写期间,Redis 会逐步将数据同步到磁盘,而不是一次性同步。
四、rocketmq优化配置
#当设置为0时,内核会进行严格的内存检查,只分配真正可用的物理内存。这可以防止过分配,但可能会导致某些应用程序无法运行或性能下降。
#当设置为1时,内核会允许过分配。这意味着即使没有足够的物理内存,内核也会尽可能地满足进程的内存请求。这种设置可能会导致交换(swap)和性能问题,但在某些情况下,对于某些应用程序来说是必要的。
sudo sysctl -w vm.overcommit_memory=1
#内核会清除页缓存、dentries和inodes。
sudo sysctl -w vm.drop_caches=1
#用于控制在内存区域耗尽时如何回收内存。当设置为0时,表示关闭了zone_reclaim模式,这意味着从其他内存区域或NUMA节点来满足内存分配请求。
sudo sysctl -w vm.zone_reclaim_mode=0
#设置进程的最大内存映射数量
sudo sysctl -w vm.max_map_count=655360
#控制磁盘写入的背景阈值。当系统的脏页(即被修改过的内存页)比例达到这个阈值时,内核会开始将脏页异步地写入磁盘,以释放内存空间。
sudo sysctl -w vm.dirty_background_ratio=50
#控制磁盘写入的阈值。当系统的脏页比例达到这个阈值时,内核将不再允许应用程序继续写入内存,直到足够的脏页被异步地写入磁盘。这样可以防止内存空间耗尽,并确保系统有足够的可用内存。
sudo sysctl -w vm.dirty_ratio=50
#控制脏页写回的频率。指定了每隔多少时间(以百分之一秒为单位)内核会检查并写回脏页。
sudo sysctl -w vm.dirty_writeback_centisecs=360000
#控制VM的虚拟内存。当发生页面错误时,Linux VM子系统为了避免过多的磁盘寻址,会读取大量的页面。
sudo sysctl -w vm.page-cluster=3
#控制Linux系统交换分区的使用情况。它的值范围是0到100,其中0表示尽量使用磁盘交换,100表示尽量使用交换分区。
sudo sysctl -w vm.swappiness=1
#设置了文件描述符的上限。每个打开的文件、套接字、管道等都由一个文件描述符来标识。设置文件描述符的上限有助于防止程序打开过多的文件或套接字,从而导致资源耗尽或系统崩溃。
echo ‘ulimit -n 655350’ >> /etc/profile
#限制的主要目的是防止用户打开过多的文件,从而导致系统资源耗尽或达到系统的限制。
echo ‘* hard nofile 655350’ >> /etc/security/limits.conf
#控制用户进程可以锁定到内存中的最大字节数。
echo ‘* hard memlock unlimited’ >> /etc/security/limits.conf
#控制用户进程可以锁定到内存中的最大字节数。与 hard memlock 不同的是,soft memlock 是一个软限制,当进程尝试锁定超过这个限制时,系统会发送一个信号给进程,要求它减少内存锁定。
echo ‘* soft memlock unlimited’ >> /etc/security/limits.conf