1. Open File Descriptors

Linux在系统调用,大量的系统调用都依赖于文件描述符,而文件描述符可分配给进程的最大大小由资源限制来定义。

因此,如果文件描述符大小不够,或有不正常网络连接(Socket也算)、文件IO没有关闭并释放出文件描述符。也可以说是文件句柄(File Operator),会导致出现Too many open files的错误。

该错误很常见,因此OP几乎都有做优化。

使用如下命令可以查看系统相关的配置:

ulimit -u 查看open files设置

ulimit -a 查看所有配置

ulimit -u 65535 临时修改open files为65535

ulimit -n 65536 用户可以同时打开的最大文件数(max open files)

lsof -p pid ID 查看某进程当前打开的文件资源

针对所有用户及session有效的长期修改方法为:

$ sudo vim /etc/security/limits.conf

# allow all users to open 100000 files

# alternatively, replace * with an explicit username

* soft nofile 100000 #限制单个进程最大文件句柄数

* hard nofile 100000

同时需要修改/etc/sysctl.conf,设置整个系统最大文件句柄数,运行sysctl -p生效

# /etc/sysctl.conf

# Increase system file descriptor limit

fs.file-max = 100000

2TCP time wait间隔指定的时间长度,一个socket在等待FIN数据包从发送者发送时强行关闭。如果TCP没有进入CLOSED状态,主动关闭在发送最后一个ack后,就会进入TIME_WAIT。

这在Cache软件里最为常见,但其它Server也存在。

net.ipv4.tcp_fin_timeout = 30  保持FIN-WAIT-2状态时间。

net.ipv4.tcp_keepalive_time = 1200

net.ipv4.tcp_syncookies = 1

net.ipv4.tcp_tw_reuse = 1 开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认0,表示关闭

net.ipv4.tcp_tw_recycle = 1 开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。

net.ipv4.ip_local_port_range = 1024    65000

# 表示用于向外连接的端口范围。

# 缺省情况下很小:32768到61000,改为18000到65535。

net.ipv4.tcp_max_syn_backlog = 8192 表示SYN队列的长度,默认1024,可以容纳更多等待连接的网络连接数。

net.ipv4.tcp_max_tw_buckets = 5000

# 表示系统同时保持TIME_WAIT套接字最大数量.

# 如果超出TIME_WAIT套接字将立刻被清除并打印警告信息。默认为180000,改为5000。

理解服务器tcp状态

10

SYN_SEND     请求服务端建立连接。

SYN_RECEIVED 服务器接收到了来自客户端的SYN。

ESTABLISHED  客户端接收到了服务端的SYN,会话建立完成。

LISTEN     服务器端开始接收连接。

FIN_WAIT_1   指示活动结束。

TIMED_WAIT   客户端在活动结束后将进入此状态。

CLOSE_WAIT   表示被动关闭。服务器只是从客户端收到第一个翼片。

FIN_WAIT_2   客户端从服务器收到其第一个 FIN 的确认。

LAST_ACK     发送自己的FIN后进入此状态。

CLOSED       服务器从客户端收到 ACK,连接已关闭。

附赵岩和我whoisd上面总结的

可以通过系统的sysctl.conf配置文件进行优化

1、减少处于FIN-WAIT-2连接状态的时间,使系统可以处理更多的连接。

net.ipv4.tcp_fin_timeout = 2

如果由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间。

对端可以出错并永远不关闭连接,甚至意外当机,缺省值是60秒。

内核的通常值是180秒,可以按这个设置,但要记住的是,即使你的机器是一个轻载的WEB服务器,也有因为大量的死套接字而内存溢出的风险,FIN-WAIT-2的危险性比FIN-WAIT-1要小,因为它最多只能吃掉1.5K内存,但是它们的生存期长些。

2、以下两参数可解决生产场景中大量连接的Web(cache)服务器中TIME_WAIT过多问题。

net.ipv4.tcp_tw_reuse = 1

表示开启重用。允许将TIME-WAIT sockets重新用于新的 TCP 连接,默认为 0 表示关闭。

3、打开TIME-WAIT重用及回收功能。

net.ipv4.tcp_tw_recycle = 1

表示开启TCP连接中TIME-WAIT sockets的快速收回功能,默认为 0 ,表示关闭。

4、当keepalive起用的时候,TCP发送keepalive消息的频度,缺省是2小时,改为20分钟。

net.ipv4.tcp_keepalive_time = 600

5、允许系统打开的端口范围

net.ipv4.ip_local_port_range = 4000    65000

表示用于向外连接的端口范围。缺省情况下很小:32768到61000,改为4000到65000。

6、提高系统支持的最大SYN半连接数(默认1024)

net.ipv4.tcp_max_syn_backlog = 16384

表示SYN队列的长度,默认为1024,加大队列长度为16384,可以容纳最多等待连接的网络连接数。

7、系统同时保持TIME_WAIT的最大数量

net.ipv4.tcp_max_tw_buckets = 360000

表示系统同时保持TIME_WAIT的最大数量,如果超过这个数字,TIME_WAIT将立刻被清除并打印警告信息。默认为180000,改为 5000。

对于Apache、Nginx等服务器,上几行的参数可以很好地减少TIME_WAIT数量,但是对于Squid,效果却不大。此项参数可以控制TIME_WAIT的最大数量,避免Squid服务器被大量的TIME_WAIT拖死。

8、路由缓存刷新频率,当一个路由失败后多长时间跳到另一个路由,默认是300。

net.ipv4.route.gc_timeout = 100

9、在内核放弃建立连接之前发送SYN包的数量。

net.ipv4.tcp_syn_retries = 1

10、减少系统SYN连接重试次数(默认是5)

net.ipv4.tcp_synack_retries = 1

为了打开对端的连接,内核需要发送一个SYN并附带一个回应前面一个SYN的ACK。

也就是所谓三次握手中的第二次握手。这个设置决定了内核放弃连接之前发送SYN+ACK包的数量。

11、设置系统对最大跟踪的TCP连接数的限制

net.ipv4.ip_conntrack_max = 25000000

一个完整的sysctl.conf文件

# /etc/sysctl.conf

# Increase system file descriptor limit

fs.file-max = 100000

# Discourage Linux from swapping idle processes to disk (default = 60)

vm.swappiness = 10

# Increase ephermeral IP ports

net.ipv4.ip_local_port_range = 10000 65000

# Increase Linux autotuning TCP buffer limits

# Set max to 16MB for 1GE and 32M (33554432) or 54M (56623104) for 10GE

# Don't set tcp_mem itself! Let the kernel scale it based on RAM.

net.core.rmem_max = 16777216

net.core.wmem_max = 16777216

net.core.rmem_default = 16777216

net.core.wmem_default = 16777216

net.core.optmem_max = 40960

net.ipv4.tcp_rmem = 4096 87380 16777216

net.ipv4.tcp_wmem = 4096 65536 16777216

# Make room for more TIME_WAIT sockets due to more clients,

# and allow them to be reused if we run out of sockets

# Also increase the max packet backlog

net.core.netdev_max_backlog = 50000

net.ipv4.tcp_max_syn_backlog = 30000

net.ipv4.tcp_max_tw_buckets = 2000000

net.ipv4.tcp_tw_reuse = 1

net.ipv4.tcp_fin_timeout = 10

# Disable TCP slow start on idle connections

net.ipv4.tcp_slow_start_after_idle = 0

# If your servers talk UDP, also up these limits

net.ipv4.udp_rmem_min = 8192

net.ipv4.udp_wmem_min = 8192

# Disable source routing and redirects

net.ipv4.conf.all.send_redirects = 0

net.ipv4.conf.all.accept_redirects = 0

net.ipv4.conf.all.accept_source_route = 0

# Log packets with impossible addresses for security

net.ipv4.conf.all.log_martians = 1

linux的php优化,linux优化转载相关推荐

  1. 如何优化linux系统

    如何优化linux系统? 1.配置更新yum源 2.关闭selinux和iptables 3.使用普通用户工作,并通过sudo按命令分类授权管理 4.最小化安装系统,只装需要的软件包 5.chattr ...

  2. linux内核参数注释与优化

    目录 1.linux内核参数注释 2.两种修改内核参数方法 3.内核优化参数生产配置 参数解释由网络上收集整理,常用优化参数对比了网上多个实际应用进行表格化整理,使查看更直观. 学习linux也有不少 ...

  3. 优化Linux系统中的服务

    优化Linux系统中的服务 实验要求 设置Linux系统每次开机后自动进入字符模式界面. 使用ntsysv工具同时调整2.3.4.5运行级别中的服务状态,关闭下列服务: atd.bluetooth.c ...

  4. 优化Linux内核参数/etc/sysctl.conf sysctl 《高性能Linux服务器构建实战:运维监控、性能调优与集群应用》...

    优化Linux内核参数/etc/sysctl.conf  sysctl  <高性能Linux服务器构建实战:运维监控.性能调优与集群应用> http://book.51cto.com/ar ...

  5. Linux 2.6.31内核优化指南

    Linux 2.6.31内核优化指南 作者:Ken Wu Email: ken.wug@gmail.com 转载本文档请注明原文链接 http://kenwublog.com/docs/linux-k ...

  6. Linux转发性能评估与优化之——转发瓶颈分析与解决方案

    线速问题 很多人对这个线速概念存在误解.认为所谓线速能力就是路由器/交换机就像一根网线一样.而这,是不可能的.应该考虑到的一个概念就是延迟.数据包进入路由器或者交换机,存在一个核心延迟操作,这就是选路 ...

  7. 嵌入式linux内存使用和性能优化

    这本书有两个关切点:系统内存(用户层)和性能优化. 这本书和Brendan Gregg的<Systems Performance>相比,无论是技术层次还是更高的理论都有较大差距.但是这不影 ...

  8. linux启动时间极限优化,Linux启动时间的极限优化

    在上次完成嵌入式应用的Linux裁减后,Linux的启动时间仍需要7s左右,虽然勉强可以接受,但仍然没有达到我个人所追求的目标--2s以内.况且,在实际的商用环境中,设备可靠性的要求可是"5 ...

  9. 【Linux 内核 内存管理】优化内存屏障 ③ ( 编译器屏障 | 禁止 / 开启内核抢占 与 方法保护临界区 | preempt_disable 禁止内核抢占源码 | 开启内核抢占源码 )

    文章目录 一.禁止 / 开启内核抢占 与 方法保护临界区 二.编译器优化屏障 三.preempt_disable 禁止内核抢占 源码 四.preempt_enable 开启内核抢占 源码 一.禁止 / ...

  10. 【Linux 内核 内存管理】优化内存屏障 ② ( 内存屏障 | 编译器屏障 | 处理器内存屏障 | 内存映射 I/O 写屏障 )

    文章目录 一.内存屏障 二.编译器屏障 三.处理器内存屏障 一.内存屏障 内存屏障 , 又称为 " 屏障指令 " , 用于保证 " 编译器 " 或 " ...

最新文章

  1. 在Mac上使用pip3安装交互式环境IPython实录
  2. [改善Java代码]不要主动进行垃圾回收
  3. RecyclerView悬浮标题
  4. 怎么将excel中的url批量转化为图片_阿里云+Power BI,轻松实现图片可视化报告(一)...
  5. Go连接MySql数据库too many connections
  6. Mysql安装问题汇总
  7. Python中文编码 - Python零基础入门教程
  8. 大型项目用python吗_在大型项目上,Python 是个烂语言吗?
  9. 职场不是家,不会方法,如何混职场
  10. java课程心得_Java课程感想
  11. ▲▲▲▲▲▲▲▲▲▲▲yum源的配置(本地和ftp)▲▲▲▲▲▲▲▲▲▲▲▲▲v...
  12. python lambda拉姆达表达式
  13. easyui动态修改required
  14. 毕业寄语 | 关于毕业季的温柔文案
  15. 使用set集合去除重复元素
  16. Opencv4学习-3、进阶图像基本操作1
  17. android 录像 视频大小,Android相机 – 录制视频时预览放大
  18. easyExcel工具
  19. DOM是什么意思-前端入门
  20. 分享一款在线视频播放器:h-player

热门文章

  1. SQL 2005/2008 清空收缩日志
  2. Mac OS X下配置Cocos2d-x for Android(Eclipse)IOS(Xcode)开发环境
  3. 【转】BI 入门: 体系架构及相关技术
  4. 如何授权用户访问网站 - [MOSS 2007应用日记]
  5. 留存率提高20%+,如何通过产品迭代做用户增长?
  6. 移动产品经理必须要知道的11件事
  7. 优化网站性能 提高网站速度访问速度的14条实践
  8. linux达人养成计划学习笔记(四)—— 压缩命令
  9. 深度剖析Kubernetes API Server三部曲 - part 2
  10. Content-Type简要说明