### 1. 进程限制
```bash
ulimit -n # 默认为1024,即只能一个进程只能打开1024个文件描述符,也就是只能维持1024个tcp连接
# 临时修改ulimit
ulimit -n 100000
# 永久修改ulimit
vi /etc/profile
ulimit -n 1000000 # 添加
# 或者编辑/etc/security/limits.conf,加入下面后重启
* soft nofile 1000000
* hard nofile 1000000
root soft nofile 1000000
root hard nofile 1000000
* soft core unlimited
* hard core unlimited
root soft core unlimited
root hard core unlimited
```
### 2. 全局限制
#### 2.1 查看文件句柄分配
```bash
cat /proc/sys/fs/file-nr
```
改命令会返回3个值,分别为已经分配的文件句柄数,已经分配但没有使用的文件句柄数,最大文件句柄数
#### 2.2 内核参数
每一个配置对应一个文件,例如net.ipv4.tcp_mem对应着/proc/sys/net/ipv4/tcp_mem文件
修改配置方式有3种:
- sysctl -w key=value 临时修改
- echo value > /proc/sys/key 临时修改,直接修改对应文件的值
- 用root权限直接修改/etc/sysctl.conf文件,保存后需要sysctl -p加载新配置
常用的配置参数如下:
```bash
# 表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;
net.ipv4.tcp_syncookies = 1
# 表示SYN队列的长度,默认为1024,加大队列长度为8192,可以容纳更多等待连接的网络连接数
net.ipv4.tcp_max_syn_backlog = 81920
# 3次握手中服务端响应SYN+ACK的次数,如果超过这个次数,服务端会放弃这个连接
net.ipv4.tcp_synack_retries=3
# 3次握手中客户端发送syn的次数,如果超过这个次数,客户端会放弃这个连接
net.ipv4.tcp_syn_retries=3
# 本端断开连接,tcp保持在FIN-WAIT-2状态的时间
net.ipv4.tcp_fin_timeout = 30
# 如果某个TCP连接在空闲1800秒后,内核才发起探针.如果探测9次(每次3秒)不成功,内核才彻底放弃,认为该连接已失效
net.ipv4.tcp_keepalive_time = 1800
net.ipv4.tcp_keepalive_probes = 9
net.ipv4.tcp_keepalive_intvl = 3
# 是否允许重新应用处于TIME-WAIT状态的socket用于新的TCP连接
net.ipv4.tcp_tw_reuse = 1
# 可以用于快速减少在TIME-WAIT状态TCP连接数,慎开启
net.ipv4.tcp_tw_recycle = 1
# 用于向外连接的端口范围。缺省情况下很小:32768到61000,改为1024到65000。
net.ipv4.ip_local_port_range = 20000 65000
# 表示系统同时保持TIME_WAIT套接字的最大数量,如果超过这个数字,TIME_WAIT套接字将立刻被清除并打印警告信息
net.ipv4.tcp_max_tw_buckets = 200000
# 可参考的优化值是:786432 1048576 1572864
net.ipv4.tcp_mem = 379008 505344 758016
# TCP写buffer,可参考的优化值:32768 436600 873200
net.ipv4.tcp_wmem = 32768 436600 873200
# TCP读buffer,可参考的优化值:32768 436600 873200
net.ipv4.tcp_rmem = 32768 436600 873200
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
# 最大socket读buffer,可参考的优化值:873200
net.core.rmem_max = 873200
# 最大socket写buffer,可参考的优化值:873200
net.core.wmem_max = 873200
```
### 3. 端口限制
> 操作系统1024以下端口为保留端口,从1024~65535为用户使用;
一个tcp连接由四部分组成,包括本机ip,本机port,远程ip,远程port;所以说并不是一个连接占一个端口,有65535个端口就只能并发65535个连接;例如,如果是服务端的话,理论上可以创建(远程ip * 远程port)个连接,如果是客户端模拟并发请求某个服务的话,理论上最多只能并发65535个请求
- php
- 编译安装
- 基本概念
- 垃圾回收机制
- 生命周期
- zval底层实现
- c扩展开发
- gdb调试工具
- 自定义扩展简单demo
- 钩子函数
- 读取php.ini配置
- 数组
- 函数
- 类
- yaf扩展底层源码
- swoole扩展底层源码
- memoryGlobal内存池
- swoole协程使用记录
- 单点登录sso原理
- compser使用
- session实现机制
- c & linux
- gcc
- 指针
- 结构体,联合和位字段
- 宏定义井号说明
- printf家族函数和可变参数
- 共享函数
- 静态库和动态库
- makefile自动化构建
- 信号一
- 信号二
- inotify监控文件事件
- socket编程
- 简介
- UNIX DOMAIN
- Internet DOMAIN
- TCP/IP
- 文件IO多路复用
- 内存管理
- 进程组,会话和控制终端
- daemon守护进程
- 多进程
- 多线程
- 常用进制转换
- go
- 入门知识
- 字节和整数装换
- python
- redis
- 应用场景
- 消息队列
- 热点数据
- 扫码登录
- 订阅发布
- 次数限制
- 抢购超卖
- 持久化机制
- mysql
- 工作流程
- MyISAM和InnoDB区别
- 用户和权限管理
- 执行计划
- sql优化
- 事务和锁
- 慢查询日志
- case...when...then...end用法
- sql
- 参考
- linux
- 内核参数优化
- 防火墙设置
- docker
- docker入门知识
- 算法
- 多维数组合
- DFA算法
- 红包金额分配