面试答案-简单内核及系统层面调优

linux层面

linux文件句柄

linux在整个系统层面和单个进程两个层面对打开的文件句柄进行限制。

1.配置文件/proc/sys/fs/file-max是对整个系统层面对打开的文件句柄最大数进行控制,单个用户或进程能够打开的文件句柄数受此限制。

通过ulimit -a查看当前用户或进程能够打开的最大文件数:


上述只是默认值,在实际生产环境肯定是不够用的,如果配置过小,有时会报类似can't open so many files的错误。通过ulimit -n可以对该值进行临时修改。如果想永久生效,需要修改配置文件/etc/security/limits.conf,如soft nofile 10000、hard nofile 10000追加到配置文件中。

2.单个用户最大进程数上图中max user processes就是单个用户最大进程数的限制,通过ulimit -u可以临时修改。永久修改需要追加,如soft nproc 10000、hard nproc 10000到/etc/security/limits.conf文件中

3.swap分区又被称为交换分区,占用的是磁盘空间。操作系统可以将一部分数据存于swap分区中,从而为当前运行的程序腾出足够的内存空间。但因为数据存于磁盘,性能会相对内存低,尤其是读写频繁的情绪,IO消耗会更大。合理设置swap分区大小,比如设置为0,优先使用物理内存。设置方式echo vm.swappiness=0 >> /etc/sysctl.conf。

针对不同系统、用户需要修改的文件可能有所不同,比如对于普通用户最大打开进程限制配置文件/etc/security/limits.d/20-nproc.conf。

内核层面

TCP并发性能优化

net.core.somaxconn = 1280 
#定义了系统中每一个端口最大的监听队列长度,这是个全局的参数
net.ipv4.tcp_max_syn_backlog = 1280 
#SYN队列的长度,增大其值可以增大服务器接收并发的能力
net.ipv4.tcp_max_tw_buckets = 8192 
#针对TIME-WAIT数量配置其上限
net.ipv4.tcp_syn_retries = 6 
#server主动连接client时发送syn的重试次数
net.ipv4.tcp_synack_retries = 5 
#server应答client的synack的重试次数
net.ipv4.tcp_fin_timeout = 30 
#server端主动发起断开连接后保持在FIN-WAIT-2状态的时间
net.ipv4.tcp_max_orphans = 8192 
#允许保留的僵尸套接字的最大值
net.core.netdev_max_backlog = 2000 
#网卡设备将请求放入队列的长度
net.core.netdev_tstamp_prequeue = 1 
#网络设备预置队列序号
net.ipv4.tcp_tw_recycle = 0 
#是否需要快速回收TIME-WAIT套接字,不建议快速回收,但可以reuse,否则NAT环境会有问题
net.ipv4.tcp_tw_reuse = 1 
#是否允许将处于TIME-WAIT状态的socket(TIME-WAIT的端口)用于新的TCP连接
net.ipv4.tcp_window_scaling = 1 
#要支持超过64KB的TCP窗口,必须启用该值,TCP连接双方都启用时才生效
net.ipv4.tcp_syncookies = 1 
#是否打开SYN Cookie功能,该功能可以防止部分SYN×××
net.ipv4.tcp_timestamps = 1 
#是否启用TCP时间戳(会在TCP包头增加12个字节),增加了报文大小,但实现了更好的TCP性能

TCP keepalive时长控制

net.ipv4.tcp_keepalive_intvl = 30 
#探测消息未获得响应时,重发该消息的间隔时间(秒)
net.ipv4.tcp_keepalive_probes = 3 
#在认定TCP连接失效之前,最多发送多少个keepalive探测消息
net.ipv4.tcp_keepalive_time = 1800 
#TCP发送keepalive探测消息的间隔时间(秒),用于确认TCP连接是否有效

IO密集性服务器优化参数

vm.dirty_expire_centisecs = 3000 
#声明Linux内核写缓冲区里面的数据多"旧"了之后,pdflush/flush/kdmflush进程就开始考虑写到磁盘中去
vm.dirty_background_ratio = 10 
#当系统脏页的比例或者所占内存数量超过 dirty_background_ratio(百分数)阈值时,启动相关内核线程(pdflush/flush/kdmflush)开始将脏页写入磁盘
vm.dirty_ratio = 30 
#当系统pagecache的脏页达到系统内存 dirty_ratio(百分数)阈值时,系统就会阻塞新的写请求,直到脏页被回写到磁盘
vm.drop_caches = 0
#释放cache,该参数每修改一次,触发一次释放操作
vm.dirty_writeback_centisecs = 500 
#内核线程(pdflush/flush/kdmflush)多久唤醒一次来检查是否需要将cache中的数据写入磁盘,单位1/100秒
 
LVS负载均衡需要修改选项arp_ignore=1,arp_announce=2,两项的默认开关不用修改,需要修改all和lo
net.ipv4.conf.default.arp_ignore = 0
net.ipv4.conf.all.arp_ignore = 0 
#定义对目标地址为本地IP的ARP询问不同的应答模式
#0:回应任何网络接口上对任何本地IP地址的arp查询请求
#1:只回答目标IP地址是来访网络接口本地地址的ARP查询请求
#2:只回答目标IP地址是来访网络接口本地地址的ARP查询请求,且来访IP必须在该网络接口的子网段内 
#3:不回应该网络界面的arp请求,而只对设置的唯一和连接地址做出回应
#8:不回应所有(本地地址)的arp查询
net.ipv4.conf.lo.arp_ignore = 0
net.ipv4.conf.default.arp_announce = 0
net.ipv4.conf.all.arp_announce = 0 #对网络接口上,本地IP地址的发出的,ARP回应,作出相应级别的限制: 确定不同程度的限制,宣布对来自本地源IP地址发出Arp请求的接口
#0: 在任意网络接口(eth0,eth1,lo)上的任何本地地址
#1:尽量避免不在该网络接口子网段的本地地址做出arp回应. 当发起ARP请求的源IP地址是被设置应该经由路由达到此网络接口的时候很有用.此时会检查来访IP是否为所有接口上的子网段内ip之一.如果改来访IP不属于各个网络接口上的子网段内,那么将采用级别2的方式来进行处理. 
#2:对查询目标使用最适当的本地地址.在此模式下将忽略这个IP数据包的源地址并尝试选择与能与该地址通信的本地地址.首要是选择所有的网络接口的子网中外出访问子网中包含该目标IP地址的本地地址. 如果没有合适的地址被发现,将选择当前的发送网络接口或其他的有可能接受到该ARP回应的网络接口来进行发送.
net.ipv4.conf.lo.arp_announce = 0
net.ipv4.ip_no_pmtu_disc = 0 #是否关闭路径MTU探测功能
net.ipv4.ip_forward_use_pmtu = 0 #是否支持巨型帧转发(使用LVS做负载均衡器时建议此值为1)
net.ipv4.conf.default.arp_accept = 0
net.ipv4.conf.all.arp_accept = 0 
#默认对不在ARP表中的IP地址发出的APR包的处理方式:0不在ARP表中创建对应IP地址的表项;1在ARP表中创建对应IP地址的表项
net.ipv4.conf.default.arp_filter = 0
net.ipv4.conf.all.arp_filter = 0 

memory

vm.overcommit_memory = 0 
#控制是否允许超额申请内存
vm.overcommit_ratio = 50 
#只有当vm.overcommit_memory=2时此值才会生效
vm.page-cluster = 3 
#控制内核一次从SWAP中连续读取2的多少次幂内存页
vm.panic_on_oom = 0 
#控制内核在OOM时是否panic(恐慌)
vm.stat_interval = 1 
#VM统计信息更新的时间间隔,默认值1s
vm.swappiness = 0 
#控制物理内存剩余%多少时使用SWAP(建议值0,但0并非禁用SWAP,只是充分利用物理内存)
vm.min_free_kbytes = 45056 
#系统内核保留内存的最低值
vm.user_reserve_kbytes = 60942 
#始终会预留给用户空间的内存,此处预留60M
vm.admin_reserve_kbytes = 8192 
#始终会预留给管理员的内存,此处预留8M

OOM控制

vm.oom_dump_tasks = 1 
#OOM信息打印
vm.oom_kill_allocating_task = 0 
#控制是否杀死触发OOM的进程(建议值0 OOM发生时内核自动kill内存占用最多的进程)

内存大页面使用策略

vm.nr_hugepages = 0 

系统端口设定

net.ipv4.ip_local_port_range = 10000 65535 
#服务器端可用端口范围(建议值 1024 65535)
net.ipv4.ip_local_reserved_ports = 
#系统预留端口列表:可以防止并发时占用服务端口
 
TCP丢包重传机制控制,TCP拥塞控制算法对TCP传输速率的影响比较大
net.ipv4.tcp_available_congestion_control = cubic reno 
#内核中可用的TCP拥塞控制算法
net.ipv4.tcp_congestion_control = cubic 
#当前正在使用的TCP拥塞控制算法
net.ipv4.tcp_allowed_congestion_control = cubic reno 
#IPV4 TCP允许的拥塞控制算法

RAID性能参数调优

dev.raid.speed_limit_min = 1000 
#RAID最小读取速率
dev.raid.speed_limit_max = 200000 
#RAID最大读取速率,如果RAID性能较高,可以修改此上限来提升IO性能
dev.scsi.logging_level = 0 
#是否开启scsi磁盘的日志功能,一般情况不建议开启

对于用不上IPV6的建议直接禁用

net.ipv6.conf.default.disable_ipv6 = 1 
#默认是否在lo接口上禁用IPv6 (XenServer虚机禁用无效)
net.ipv6.conf.all.disable_ipv6 = 1 
#是否在所有接口上禁用IPv6 (XenServer虚机禁用无效)
net.ipv6.conf.lo.disable_ipv6 = 1 
#是否在lo接口上禁用IPv6 (XenServer虚机禁用无效)

安全防护模块

net.ipv4.conf.default.log_martians = 0 
#默认是否开启并记录欺骗,源路由和重定向数据包(如果是路由器建议值为1)
net.ipv4.conf.all.log_martians = 0 
#是否开启并记录欺骗,源路由和重定向数据包:记录带有不允许的地址的数据报到内核日志中(如果是路由器建议值为1)
net.ipv4.conf.default.accept_redirects = 1 
#默认是否接收重写过的数据包
net.ipv4.conf.all.accept_redirects = 1 
#是否接收重写过的数据包:用作路由器时默认值为0
net.ipv4.conf.default.accept_source_route = 0 
#默认是否接收无源路由的数据包
net.ipv4.conf.all.accept_source_route = 0 
#是否接收无源路由的数据包
net.ipv4.conf.default.secure_redirects = 1 
#默认是否支持安全重定向数据包
net.ipv4.conf.all.secure_redirects = 1 
#是否支持安全重定向数据包
net.ipv4.conf.default.rp_filter = 1 
#默认是否开启反向路径过滤
net.ipv4.conf.all.rp_filter = 1 
#是否开启反向路径过滤
net.ipv4.tcp_invalid_ratelimit = 500 
#无效数据包发送速率时间限制(单位:毫秒)
net.ipv4.tcp_limit_output_bytes = 262144 
#单个套接字限制最大输出字节数

保障TCP通信质量

net.ipv4.tcp_sack = 1 
#是否启用有选择的应答(Selective Acknowledgment),使TCP只重新发送交互过程中
丢失的包,不用发送后续所有的包,而且提供相应机制使接收方能告诉发送方哪些数据丢失,哪些数据重发了,哪些数据已经提前收到了。如此大大提高了客户端与服务器端数据交互的效率
net.ipv4.tcp_fack = 1 
#启用转发应答(Forward Acknowledgment 建议值1),可以进行有选择应答(SACK)从而减少拥塞情况的发生
net.ipv4.tcp_slow_start_after_idle = 1 
#拥塞窗口在经过一段时间空闲后是否需要重新初始化
net.ipv4.tcp_stdurg = 0
net.ipv4.tcp_retries1 = 3 
#放弃回应一个TCP连接请求前进行重试的次数
net.ipv4.tcp_retries2 = 15 
#放弃一个已经建立的TCP连接前进行重试的次数
net.ipv4.tcp_rfc1337 = 0
net.ipv4.tcp_mtu_probing = 0 
#是否开启tcp层路径mtu发现
net.ipv4.tcp_no_metrics_save = 0 
#是否将LAST_ACK状态保存各种连接信息到路由缓存中:方便下次连接时快速恢复现场

参考
https://blog.csdn.net/weixin_40548182/article/details/108265643

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

爷来辣

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

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

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

打赏作者

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

抵扣说明:

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

余额充值