高流量大并发Linux TCP 性能调优

 

http://hong.im/2013/04/20/linux-tcp-tuning/

http://www.tuicool.com/articles/imQzam

http://blog.csdn.net/zhangskd/article/details/6715751

http://www.zxsdw.com/index.php/archives/1135/

VPS 512M 上优化MySQL性能

小内存VPS lnmp配置优化

http://blog.sina.com.cn/s/blog_a2d4803001013hrk.html

http://wuchong.me/blog/2015/02/02/shadowsocks-install-and-optimize/

linux系统swappiness参数在内存与交换分区间优化,需要在/etc/sysctl.conf修改,加上:vm.swappiness = 0

1. 服务端安装

官方推荐 Ubuntu 14.04 LTS 作为服务器以便使用 TCP Fast Open。服务器端的安装非常简单。

Debian / Ubuntu:

apt-get install python-pip
pip install shadowsocks

CentOS:

yum install python-setuptools && easy_install pip
pip install shadowsocks

然后直接在后台运行:

ssserver -p 8000 -k password -m rc4-md5 -d start

当然也可以使用配置文件进行配置,方法创建etc/shadowsocks.json文件,填入如下内容:

{
    "server":"my_server_ip",
    "server_port":8000,
    "local_address": "127.0.0.1",
    "local_port":1080,
    "password":"mypassword",
    "timeout":300,
    "method":"rc4-md5"
}

然后使用配置文件在后台运行:

ssserver -c /etc/shadowsocks.json -d start

如果要停止运行,将命令中的start改成stop

TIPS: 加密方式推荐使用rc4-md5,因为 RC4 比 AES 速度快好几倍,如果用在路由器上会带来显著性能提升。旧的 RC4 加密之所以不安全是因为 Shadowsocks 在每个连接上重复使用 key,没有使用 IV。现在已经重新正确实现,可以放心使用。更多可以看 issue

2. 客户端安装

客户端安装比较入门,这里就不说了,可以参考这篇文章

3. 加速优化

下面介绍几种简单的优化方法,也是比较推荐的几种,能够得到立竿见影的效果。当然还有一些黑科技我没提到,如有大神路过,也可留言指出。

3.1 内核参数优化

首先,将 Linux 内核升级到 3.5 或以上。

第一步,增加系统文件描述符的最大限数

编辑文件 limits.conf

vi /etc/security/limits.conf

增加以下两行

* soft nofile 51200
* hard nofile 51200

启动shadowsocks服务器之前,设置以下参数

ulimit -n 51200

第二步,调整内核参数
修改配置文件 /etc/sysctl.conf

fs.file-max = 51200

net.core.rmem_max = 67108864
net.core.wmem_max = 67108864
net.core.netdev_max_backlog = 250000
net.core.somaxconn = 4096

net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 0
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.ip_local_port_range = 10000 65000
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.tcp_fastopen = 3
net.ipv4.tcp_rmem = 4096 87380 67108864
net.ipv4.tcp_wmem = 4096 65536 67108864
net.ipv4.tcp_mtu_probing = 1
net.ipv4.tcp_congestion_control = hybla

修改后执行 sysctl -p 使配置生效

3.2 锐速

锐速是一款非常不错的TCP底层加速软件,可以非常方便快速地完成服务器网络的优化,配合 ShadowSocks 效果奇佳。目前锐速官方也出了永久免费版本,适用带宽20M、3000加速连接,个人使用是足够了。如果需要,先要在锐速官网注册个账户。

然后确定自己的内核是否在锐速的支持列表里,如果不在,请先更换内核,如果不确定,请使用 手动安装

确定自己的内核版本在支持列表里,就可以使用以下命令快速安装了。

wget http://my.serverspeeder.com/d/ls/serverSpeederInstaller.tar.gz
tar xzvf serverSpeederInstaller.tar.gz
bash serverSpeederInstaller.sh

输入在官网注册的账号密码进行安装,参数设置直接回车默认即可,
最后两项输入 y 开机自动启动锐速,y 立刻启动锐速。之后可以通过lsmod查看是否有appex模块在运行。

到这里还没结束,我们还要修改锐速的3个参数,vi /serverspeeder/etc/config

rsc="1" #RSC网卡驱动模式  
advinacc="1" #流量方向加速  
maxmode="1" #最大传输模式

digitalocean vps的网卡支持rsc和gso高级算法,所以可以开启rsc="1"gso="1"

重新启动锐速

service serverSpeeder restart

3.3 net-speeder

net-speeder 原理非常简单粗暴,就是发包翻倍,这会占用大量的国际出口带宽,本质是损人利己,不建议使用。

(1) Ubuntu/Debian 下安装依赖包

apt-get install libnet1
apt-get install libpcap0.8
apt-get install libnet1-dev
apt-get install libpcap0.8-dev

(2) Centos 下安装依赖包
需要配置 epel 第三方源。下载 epel :http://dl.fedoraproject.org/pub/epel/ 。例如,Centos 7 x64:

wget http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noarch.rpm
rpm -ivh epel-release-7-5.noarch.rpm
yum repolist

然后安装依赖包:

yum install libnet libpcap libnet-devel libpcap-devel

(3) 下载官方的 tar.gz 压缩包。解压安装运行:

wget http://net-speeder.googlecode.com/files/net_speeder-v0.1.tar.gz 
tar zxvf net_speeder-v0.1.tar.gz
cd net_speeder
chmod 777 *
sh build.sh -DCOOKED

首先你需要知道你的网卡设备名,可以使用 ifconfig 查看。假设是eth0,那么运行方法是:

./net_speeder eth0 "ip"

关闭 net-speeder

killall net_speeder

哦,对了,作者已经将 net-speeder 迁移到 GitHub 了,感兴趣的可以关注、贡献。

以上几种方法是我用过的几种比较有效的加速方法。有任何错误之处还请在下面留言指出。

 

tcp_keepalive的设置

查看相关的参数

sysctl -a|grep tcp_keepalive
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 2
net.ipv4.tcp_keepalive_time = 160

设置相关的参数

sysctl -w net.ipv4.tcp_keepalive_time = 7500

也可以直接打开/etc/sysctl.conf

加入net.ipv4.tcp_keepalive_time = 7500,然后保存退出

让参数生效

sysctl -p

2.参数相关的说明

/proc/sys/net/ipv4/tcp_keepalive_time
当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时。
/proc/sys/net/ipv4/tcp_keepalive_intvl
当探测没有确认时,重新发送探测的频度。缺省是75秒。
/proc/sys/net/ipv4/tcp_keepalive_probes
在认定连接失效之前,发送多少个TCP的keepalive探测包。缺省值是9。这个值乘以tcp_keepalive_intvl之后决定了,一个连接发送了keepalive之后可以有多少时间没有回应

tcp_keepalive_time :INTEGER
默认值是7200(2小时)
当keepalive打开的情况下,TCP发送keepalive消息的频率。(由于目前网络攻击等因素,造成了利用这个进行的攻击很频繁,曾经也有cu的朋友提到过,说如果2边建立了连接,然后不发送任何数据或者rst/fin消息,那么持续的时间是不是就是2小时,空连接攻击? tcp_keepalive_time就是预防此情形的.我个人在做nat服务的时候的修改值为1800秒)

tcp_keepalive_probes:INTEGER
默认值是9
TCP发送keepalive探测以确定该连接已经断开的次数。(注意:保持连接仅在SO_KEEPALIVE套接字选项被打开是才发送.次数默认不需要修改,当然根据情形也可以适当地缩短此值.设置为5比较合适)

tcp_keepalive_intvl:INTEGER
默认值为75
探测消息发送的频率,乘以tcp_keepalive_probes就得到对于从开始探测以来没有响应的连接杀除的时间。默认值为75秒,也就是没有活动的连接将在大约11分钟以后将被丢弃。(对于普通应用来说,这个值有一些偏大,可以根据需要改小.特别是web类服务器需要改小该值,15是个比较合适的值)
$ /proc/sys/net/ipv4/tcp_keepalive_time
$ /proc/sys/net/ipv4/tcp_keepalive_intvl
$ /proc/sys/net/ipv4/tcp_keepalive_probes
这3个参数与TCP KeepAlive有关.默认值是:
tcp_keepalive_time = 7200 seconds (2 hours)
tcp_keepalive_probes = 9
tcp_keepalive_intvl = 75 seconds
意思是如果某个TCP连接在idle 2个小时后,内核才发起probe.如果probe 9次(每次75秒)不成功,内核才彻底放弃,认为该连接已失效.对服务器而言,显然上述值太大. 可调整到:
/proc/sys/net/ipv4/tcp_keepalive_time 1800
/proc/sys/net/ipv4/tcp_keepalive_intvl 30
/proc/sys/net/ipv4/tcp_keepalive_probes 3

呃……标题比较隐晦。其实主要是手里面的跑openvpn服务器。因为并没有明文禁p2p(哎……想想那么多流量好像不跑点p2p也跑不完),所以造成有的时候如果有比较多人跑BT的话,会造成VPN速度急剧下降。

本文参考文章为:

优化Linux下的内核TCP参数来提高服务器负载能力

Linux Tuning

本文所面对的情况为:

  1. 高并发数
  2. 高延迟高丢包(典型的美国服务器)

值得注意的是,因为openvz的VPS权限比较低,能够修改的地方比较少,所以使用openvz的VPS作VPN服务器是非常不推荐的。

我们通过修改 /etc/sysctl.conf 来达到调整的目的,注意修改完以后记得使用:

sysctl -p

来使修改生效。

首先,针对高并发数,我们需要提高一些linux的默认限制:

fs.file-max = 51200
#提高整个系统的文件限制
net.ipv4.tcp_syncookies = 1
#表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;
net.ipv4.tcp_tw_reuse = 1
#表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;
net.ipv4.tcp_tw_recycle = 0
#表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭;
#为了对NAT设备更友好,建议设置为0。
net.ipv4.tcp_fin_timeout = 30
#修改系統默认的 TIMEOUT 时间。
net.ipv4.tcp_keepalive_time = 1200
#表示当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时,改为20分钟。
net.ipv4.ip_local_port_range = 10000 65000 #表示用于向外连接的端口范围。缺省情况下很小:3276861000,改为1000065000。(注意:这里不要将最低值设的太低,否则可能会占用掉正常的端口!)
net.ipv4.tcp_max_syn_backlog = 8192
#表示SYN队列的长度,默认为1024,加大队列长度为8192,可以容纳更多等待连接的网络连接数。
net.ipv4.tcp_max_tw_buckets = 5000
#表示系统同时保持TIME_WAIT的最大数量,如果超过这个数字,TIME_WAIT将立刻被清除并打印警告信息。

#额外的,对于内核版本新于**3.7.1**的,我们可以开启tcp_fastopen:
net.ipv4.tcp_fastopen = 3

其次,针对大流量高丢包高延迟的情况,我们通过增大缓存来提高TCP性能,自己看E文注释吧……感觉我翻译出来各种味道不对 = =:

# increase TCP max buffer size settable using setsockopt()
net.core.rmem_max = 67108864 
net.core.wmem_max = 67108864 
# increase Linux autotuning TCP buffer limit
net.ipv4.tcp_rmem = 4096 87380 67108864
net.ipv4.tcp_wmem = 4096 65536 67108864
# increase the length of the processor input queue
net.core.netdev_max_backlog = 250000
# recommended for hosts with jumbo frames enabled
net.ipv4.tcp_mtu_probing=1

这里面涉及到一个TCP拥塞算法的问题,你可以用下面的命令查看本机提供的拥塞算法控制模块:

sysctl net.ipv4.tcp_available_congestion_control

如果没有下文提到的htcp,hybla算法,你可以尝试通过modprobe启用模块:

/sbin/modprobe tcp_htcp
/sbin/modprobe tcp_hybla

对于几种算法的分析,详情可以参考下:TCP拥塞控制算法 优缺点 适用环境 性能分析,但是这里面没有涉及到专门为卫星通讯设计的拥塞控制算法:Hybla。根据各位大神的实验,我们发现Hybla算法恰好是最适合美国服务器的TCP拥塞算法,而对于日本服务器,个人想当然的认为htcp算法应该可以比默认的cubic算法达到更好的效果。但是因为htcp算法恰好没有编入我们所使用的VPS中,所以没办法测试。

#设置TCP拥塞算法为 hybla
net.ipv4.tcp_congestion_control=hybla

更新:2014-06-22 修改TW快速回收的问题以更好的兼容移动设备。

调整/etc/sysctl.conf网络参数提高系统负载

【 更新时间:2011-03-09 | 字体:
[导读]调整/etc/sysctl.conf net.ipv4.tcp_syncookies = 1 表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭; net.ipv4.tcp_tw_reuse = 1 表示开启重用。允许将T…

调整/etc/sysctl.conf

net.ipv4.tcp_syncookies = 1
表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;

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

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

net.ipv4.tcp_fin_timeout = 30
表示如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间。

net.ipv4.tcp_keepalive_time = 1200
表示当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时,改为20分钟。

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

net.ipv4.tcp_max_syn_backlog = 8192
表示SYN队列的长度,默认为1024,加大队列长度为8192,可以容纳更多等待连接的网络连接数。
如果高负载系统使用了netfilter/iptables,调整以下参数

net.ipv4.ip_conntrack_max = 655360
在内核内存中netfilter可以同时处理的“任务”(连接跟踪条目)

net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 180
跟踪的连接超时结束时间

然后执行/sbin/sysctl -p让参数生效

——————————————————————————————————————————————

本人目前用的是电信20M宽带,众所周知电信的国际出口相当窄,到了晚上访问国外网站更是卡到爆。电信还专门搞了个低延迟的国际精品网,再圈一次钱,太不要脸了。我们这些高延迟的普通用户如何在网络访问高峰时通过VPS顺畅地访问youtube呢? 这里有篇文章 给出了一个解决办法,通过优化TCP参数显著提高了速度。本人也在手头上各种VPS上测试了一下,将主要配置选项和要点记述如下。

一、加载tcp_hybla模块
首先,OpenVZ的VPS可以不用继续了。对内核的操作权限太低,没法添加相关模块。建议使用KVM。
加载tcp_hybla模块(OpenVZ在这一步就会报错):

/sbin/modprobe tcp_hybla

然后查看是否已经正常加载:

lsmod |grep hybla

如果你的内核版本较新,比如CentOS 6.x的2.6.32,则可以用下列命令查看当前可用的拥堵算法,里面应该有hybla了:

sysctl net.ipv4.tcp_available_congestion_control

经本人亲自测试,DigitalOcean、RamNode和BlueVM的KVM都可以正常加载(一冲动又买了这么多VPS,砍手啊!!)。
建议想折腾的可以先买个DigitalOcean的,毕竟可以按小时计费,不浪费钱。

二、修改/etc/sysctl.conf
将下述内容添加入sysctl.conf文件:

net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.ip_local_port_range = 10000 65000
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_max_tw_buckets = 5000
net.core.rmem_max = 67108864
net.core.wmem_max = 67108864
net.ipv4.tcp_rmem = 4096 87380 67108864
net.ipv4.tcp_wmem = 4096 65536 67108864
net.core.netdev_max_backlog = 250000
net.ipv4.tcp_mtu_probing=1
net.ipv4.tcp_congestion_control=hybla

保存后,可以用下面命令让设置立即生效:

sysctl -p

三、设置开机后自动加载tcp_hybla模块
刚才第一步里加载的模块只是暂时的,开机后还得重新加载。怎样自动加载呢?

以CentOS为例,在/etc/sysconfig/modules目录下添加一个hybla.modules文件,并且写入以下内容:

#!/bin/sh
/sbin/modprobe tcp_hybla

然后设置下可执行属性,以便于系统在开机时自动执行:

chmod +x hybla.modules

四、测试
本优化对普通网页浏览估计效果不大,可以搭个使用tcp协议的梯子,比如tcp版的openvpn,以及近年来的新秀ss(我用的nodejs版),访问下youtube视频吧!下面是我在几个VPS上的测试结果,因为各人网络情况不同,仅供参考:
DigitalOcean和RamNode: 稍微有所改善,不过不明显。顶多是从连480p都看不了变成了能看480p。
BlueVM:在我这里非常给力,优化前后差别较大。之前只能卡卡地看480p甚至320p,现在720p毫无压力,看1080p速度也能接受。如果不是这家的老板爱折腾,黑历史比较多,我就直接把博客直接迁移到BlueVM了,还便宜。
目前安心做站还是得找个靠谱的idc,Hostigation就挺不错的。BlueVM只适合买来折腾,没多大用。

 

【摘要】对多种TCP拥塞控制算法进行简要说明,指出它们的优缺点、以及它们的适用环境。

【关键字】TCP拥塞控制算法 优点    缺点   适用环境公平性

 

公平性

 

公平性是在发生拥塞时各源端(或同一源端建立的不同TCP连接或UDP数据报)能公平地共享同一网络资源(如带宽、缓存等)。处于相同级别的源端应该得到相同数量的网络资源。产生公平性的根本原因在于拥塞发生必然导致数据包丢失,而数据包丢失会导致各数据流之间为争抢有限的网络资源发生竞争,争抢能力弱的数据流将受到更多损害。因此,没有拥塞,也就没有公平性问题。

TCP层上的公平性问题表现在两方面:

(1) 面向连接的TCP和无连接的UDP在拥塞发生时对拥塞指示的不同反应和处理,导致对网络资源的不公平使用问题。在拥塞发生时,有拥塞控制反应机制的TCP数据流会按拥塞控制步骤进入拥塞避免阶段,从而主动减小发送入网络的数据量。但对无连接的数据报UDP,由于没有端到端的拥塞控制机制,即使网络发出了拥塞指示(如数据包丢失、收到重复ACK等),UDP也不会像TCP那样减少向网络发送的数据量。结果遵守拥塞控制的TCP数据流得到的网络资源越来越少,没有拥塞控制的UDP则会得到越来越多的网络资源,这就导致了网络资源在各源端分配的严重不公平。

网络资源分配的不公平反过来会加重拥塞,甚至可能导致拥塞崩溃。因此如何判断在拥塞发生时各个数据流是否严格遵守TCP拥塞控制,以及如何“惩罚”不遵守拥塞控制协议的行为,成了目前研究拥塞控制的一个热点。在传输层解决拥塞控制的公平性问题的根本方法是全面使用端到端的拥塞控制机制。

(2) 一些TCP连接之间也存在公平性问题。产生问题的原因在于一些TCP在拥塞前使用了大窗口尺寸,或者它们的RTT较小,或者数据包比其他TCP大,这样它们也会多占带宽。

 

RTT不公平性

 

AIMD拥塞窗口更新策略也存在一些缺陷,和式增加策略使发送方发送数据流的拥塞窗口在一个往返时延(RTT)内增加了一个数据包的大小,因此,当不同的数据流对网络瓶颈带宽进行竞争时,具有较小RTT的TCP数据流的拥塞窗口增加速率将会快于具有大RTT的TCP数据流,从而将会占有更多的网络带宽资源。

 

附加说明

 

中美之间的线路质量不是很好,rtt较长且时常丢包。TCP协议是成也丢包,败也丢包;TCP的设计目的是解决不可靠线路上可靠传输的问题,即为了解决丢包,但丢包却使TCP传输速度大幅下降。HTTP协议在传输层使用的是TCP协议,所以网页下载的速度就取决于TCP单线程下载的速度(因为网页就是单线程下载的)。
丢包使得TCP传输速度大幅下降的主要原因是丢包重传机制,控制这一机制的就是TCP拥塞控制算法。
Linux内核中提供了若干套TCP拥塞控制算法,已加载进内核的可以通过内核参数net.ipv4.tcp_available_congestion_control看到。

 

1. Vegas

 

1994年,Brakmo提出了一种新的拥塞控制机制TCP Vegas,从另外的一个角度来进行拥塞控制。从前面可以看到,TCP的拥塞控制是基于丢包的,一旦出现丢包,于是调整拥塞窗口,然而由于丢包不一定是由于网络进入了拥塞,但是由于RTT值与网络运行情况有比较密切的关系,于是TCP Vegas利用RTT值的改变来判断网络是否拥塞,从而调整拥塞控制窗口。如果发现RTT在增大,Vegas就认为网络正在发生拥塞,于是开始减小拥塞窗口,如果RTT变小,Vegas认为网络拥塞正在逐步解除,于是再次增加拥塞窗口。由于Vegas不是利用丢包来判断网络可用带宽,而是利用RTT变化来判断,因而可以更精确的探测网络的可用带宽,从而效率更好。然而Vegas的有一个缺陷,并且可以说致命的,最终影响TCP Vegas并没有在互联网上大规模使用。这个问题就是采用TCP Vegas的流的带宽竞争力不及未使用TCP Vegas的流,这是因为网络中路由器只要缓冲了数据,就会造成RTT的变大,如果缓冲区没有溢出的话,并不会发生拥塞,但是由于缓存数据就会导致处理时延,从而RTT变大,特别是在带宽比较小的网络上,只要一开始传输数据,RTT就会急剧增大,这个在无线网络上特别明显。在这种情况下,TCP Vegas降低自己的拥塞窗口,但是只要没有丢包的话,从上面看到标准的TCP是不会降低自己的窗口的,于是两者开始不公平,再这样循环下去,TCP Vegas的效率就非常低了。其实如果所有的TCP都采用Vegas拥塞控制方式的话,流之间的公平性会更好,竞争能力并不是Vegas算法本身的问题。

适用环境:很难在互联网上大规模适用(带宽竞争力低)

 

2. Reno

 

Reno是目前应用最广泛且较为成熟的算法。该算法所包含的慢启动、拥塞避免和快速重传、快速恢复机制,是现有的众多算法的基础。从Reno运行机制中很容易看出,为了维持一个动态平衡,必须周期性地产生一定量的丢失,再加上AIMD机制–减少快,增长慢,尤其是在大窗口环境下,由于一个数据报的丢失所带来的窗口缩小要花费很长的时间来恢复,这样,带宽利用率不可能很高且随着网络的链路带宽不断提升,这种弊端将越来越明显。公平性方面,根据统计数据,Reno的公平性还是得到了相当的肯定,它能够在较大的网络范围内理想地维持公平性原则。

Reno算法以其简单、有效和鲁棒性成为主流,被广泛的采用。

但是它不能有效的处理多个分组从同一个数据窗口丢失的情况。这一问题在New Reno算法中得到解决。

 

基于丢包反馈的协议

 

近几年来,随着高带宽延时网络(High Bandwidth-Delay product network)的普及,针对提高TCP带宽利用率这一点上,又涌现出许多新的基于丢包反馈的TCP协议改进,这其中包括HSTCP、STCP、BIC-TCP、CUBIC和H-TCP。

总的来说,基于丢包反馈的协议是一种被动式的拥塞控制机制,其依据网络中的丢包事件来做网络拥塞判断。即便网络中的负载很高时,只要没有产生拥塞丢包,协议就不会主动降低自己的发送速度。这种协议可以最大程度的利用网络剩余带宽,提高吞吐量。然而,由于基于丢包反馈协议在网络近饱和状态下所表现出来的侵略性,一方面大大提高了网络的带宽利用率;但另一方面,对于基于丢包反馈的拥塞控制协议来说,大大提高网络利用率同时意味着下一次拥塞丢包事件为期不远了,所以这些协议在提高网络带宽利用率的同时也间接加大了网络的丢包率,造成整个网络的抖动性加剧。

 

友好性

 

BIC-TCP、HSTCP、STCP等基于丢包反馈的协议在大大提高了自身吞吐率的同时,也严重影响了Reno流的吞吐率。基于丢包反馈的协议产生如此低劣的TCP友好性的组要原因在于这些协议算法本身的侵略性拥塞窗口管理机制,这些协议通常认为网络只要没有产生丢包就一定存在多余的带宽,从而不断提高自己的发送速率。其发送速率从时间的宏观角度上来看呈现出一种凹形的发展趋势,越接近网络带宽的峰值发送速率增长得越快。这不仅带来了大量拥塞丢包,同时也恶意吞并了网络中其它共存流的带宽资源,造成整个网络的公平性下降。

 

3. HSTCP(High Speed TCP)

 

HSTCP(高速传输控制协议)是高速网络中基于AIMD(加性增长和乘性减少)的一种新的拥塞控制算法,它能在高速度和大时延的网络中更有效地提高网络的吞吐率。它通过对标准TCP拥塞避免算法的增加和减少参数进行修改,从而实现了窗口的快速增长和慢速减少,使得窗口保持在一个足够大的范围,以充分利用带宽,它在高速网络中能够获得比TCP Reno高得多的带宽,但是它存在很严重的RTT不公平性。公平性指共享同一网络瓶颈的多个流之间占有的网络资源相等。

TCP发送端通过网络所期望的丢包率来动态调整HSTCP拥塞窗口的增量函数。

拥塞避免时的窗口增长方式: cwnd = cwnd + a(cwnd) / cwnd

丢包后窗口下降方式:cwnd = (1-b(cwnd))*cwnd

其中,a(cwnd)和b(cwnd)为两个函数,在标准TCP中,a(cwnd)=1,b(cwnd)=0.5,为了达到TCP的友好性,在窗口较低的情况下,也就是说在非BDP的网络环境下,HSTCP采用的是和标准TCP相同的a和b来保证两者之间的友好性。当窗口较大时(临界值LowWindow=38),采取新的a和b来达到高吞吐的要求。具体可以看RFC3649文档。

 

4. westwood

 

无线网络中,在大量研究的基础上发现tcpwestwood是一种较理想的算法,它的主要思想是通过在发送端持续不断的检测ack的到达速率来进行带宽估计,当拥塞发生时用带宽估计值来调整拥塞窗口和慢启动阈值,采用aiad(additive increase and adaptive decrease)拥塞控制机制。它不仅提高了无线网络的吞吐量,而且具有良好的公平性和与现行网络的互操作性。存在的问题是不能很好的区分传输过程中的拥塞丢包和无线丢包,导致拥塞机制频繁调用。

 

5. H-TCP

 

高性能网络中综合表现比较优秀的算法是:h-tcp,但它有rtt不公平性和低带宽不友好性等问题。

 

6. BIC-TCP

 

BIC-TCP的缺点:首先就是抢占性较强,BIC-TCP的增长函数在小链路带宽时延短的情况下比起标准的TCP来抢占性强,它在探测阶段相当于是重新启动一个慢启动算法,而TCP在处于稳定后窗口就是一直是线性增长的,不会再次执行慢启动的过程。其次,BIC-TCP的的窗口控制阶段分为binary search increase、max probing,然后还有Smax和Smin的区分,这几个值增加了算法上的实现难度,同时也对协议性能的分析模型增加了复杂度。在低RTT网络 和低速环境中,BIC可能会过于“积极”,因而人们对BIC进行了进一步的改进,即CUBIC。是Linux在采用CUBIC之前的默认算法。

 

7. CUBIC

 

CUBIC在设计上简化了BIC-TCP的窗口调整算法,在BIC-TCP的窗口调整中会出现一个凹和凸(这里的凹和凸指的是数学意义上的凹和凸,凹函数/凸函数)的增长曲线,CUBIC使用了一个三次函数(即一个立方函数),在三次函数曲线中同样存在一个凹和凸的部分,该曲线形状和BIC-TCP的曲线图十分相似,于是该部分取代BIC-TCP的增长曲线。另外,CUBIC中最关键的点在于它的窗口增长函数仅仅取决于连续的两次拥塞事件的时间间隔值,从而窗口增长完全独立于网络的时延RTT,之前讲述过的HSTCP存在严重的RTT不公平性,而CUBIC的RTT独立性质使得CUBIC能够在多条共享瓶颈链路的TCP连接之间保持良好的RTT公平性。

CUBIC is a congestion control protocol for TCP (transmission control protocol) and thecurrent default TCP algorithm in Linux. The protocol modifies the linear window growth function of existing TCP standards to be a cubic function in order to improve the scalability of TCP over fast and long distance networks. It also achieves more equitable bandwidth allocations among flows with different RTTs (round trip times) by making the window growth to be independent of RTT – thus those flows grow their congestion window at the same rate. During steady state, CUBIC increases the window size aggressively when the window is far from the saturation point, and the slowly when it is close to the saturation point.This feature allows CUBIC to be very scalable when the bandwidth and delay product of the network is large, and at the same time, be highly stable and also fair to standard TCP flows.

 

8. STCP

 

STCP,Scalable tcp。

STCP算法是由 Tom Kelly于 2003年提出的 ,通过修改 TCP的窗口增加和减少参数来调整发送窗口大小 ,以适应高速网络的环境。该算法具有很高的链路利用率和稳定性,但该机制窗口增加和 RTT成反比 ,在一定的程度上存在着 RTT不公平现象 ,而且和传统 TCP流共存时 ,过分占用带宽 ,其 TCP友好性也较差。

 

之前每次装完系统后就是优化,每优化一次都耗费不少时间,这次决定做一个记录,方便自己,也方便收藏张小三资源网的朋友们。基本上所有的VPS或服务器商家都有centos系统,就采用使用更广泛的centos系统做记录吧,虽然小三非常钟情于debian,奈何国内的很多商家抠门的没有debian镜像,我想说不为用户考虑的服务商都不是好商家,因为我曾经想买国内一家比较有名商家的VPS,结果没有debian6,果断放弃了呵呵,完美主义有时真的挺累。

centos系统优化必须做的几件事:
一:设置系统字符集
二:更新centos系统源
三:修改ip为静态获取,修改DNS及主机名
四:centos删除不必要的系统用户和群组
五:创建普通用户并进行sudo授权管理
六:修改S@SH端口和root账号
七:清空iptables,创建自己的防火墙规则
八:精简开机自启动服务
九:内核参数优化
十:设置一些全局变量

一:设置系统字符集

vi /etc/sysconfig/i18n
英文提示修改为:LANG=”en_US.UTF-8″
中文提示修改为:LANG=”zh_CN.UTF-8″

二:更新centos系统源
有些商家centos最小化安装会没有wget那就yum install wget安装一下

备份原centos更新源

mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup

更换为阿里云centos6更新源

wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo

阿里云centos5更新源

wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-5.repo

然后运行
yum makecache

开始更新系统以及内核(注意:会升级centos到高版本,我觉得对于centos越高版本,越好用的样子。呵呵)
yum upgrade

如果不希望升级到高版本,可采用下面的升级命令

yum --exclude=kernel* centos-release* update

三:修改ip为静态获取,修改DNS及主机名
备份网络配置

mv /etc/sysconfig/network-scripts/ifcfg-eth0 /etc/sysconfig/network-scripts/ifcfg-eth0.bak

vi /etc/sysconfig/network-scripts/ifcfg-eth0

DEVICE=eth0 #网卡设备名称
TYPE=Ethernet #网络类型为以太网模式
IPADDR=192.168.1.10 #IP
NETMASK=255.255.255.0 #网卡对应的网络掩码
GATEWAY=192.168.1.1 #网关地址
ONBOOT=yes #是否启动引导的时候激活YES
BOOTPROTO=static #静态IP地址 dhcp为动态
NM_CONTROLLED=no #设备eth0是否可以由Network Manager图形管理工具托管
可选参数
IPV6INIT=no
IPV6_AUTOCONF=no
HWADDR=00:0C:29:D0:C7:B5 #以太网设备的对应的物理地址
UUID=080a457b-6a53-4a3a-9155-a23c1146c2c6 #通用唯一识别码

 

vi /etc/sysconfig/network

#是否使用网络,必须设置为yes。
NETWORKING=yes
NETWORKING_IPV6=no
#设置本机的主机名,这里设置的主机名要和/etc/hosts中设置的主机名对应
HOSTNAME=zxsdw.localdomain
#设置本机连接的网关的IP地址。例如,网关为10.0.0.1或者192.168.1.1
GATEWAY=192.168.1.1

修改主机DNS
vi /etc/resolv.conf

nameserver 8.8.8.8
nameserver 4.4.4.4

修改HOSTS
vi /etc/hosts

127.0.0.1 zxsdw.localdomain
#order hosts,bind     #解析器查询顺序是文件/etc/hosts,然后是DNS
#允许主机拥有多个ip地址
multi on
#禁止ip地址欺骗
nospoof on

重启网卡生效设置两种方法
service network restart
或者
/etc/init.d/network restart四:centos删除没有必要的系统用户和群组

14792184653.jpg
awk -F “:” ‘{print $1}’ /etc/passwd

userdel adm
userdel lp
userdel sync
userdel shutdown
userdel halt
userdel news
userdel uucp
userdel operator
userdel games
userdel gopher

五:创建普通用户并进行sudo授权管理

[root@localhost~]# useradd user 
[root@localhost~]# echo "123456" | passwd --stdin user  #设置密码 
[root@localhost~]# vi /etc/sudoers  #或visudo打开,添加user用户所有权限 
root    ALL=(ALL)       ALL 
user    ALL=(ALL)       ALL

六:修改S@ SH端口和root账号

[root@localhost~]# vi /etc/ssh/sshd_config 

Port xxxxx #设置SSH登陆端口最大不要超过65536
PermitRootLogin no #禁止root用户登陆
PermitEmptyPasswords no #禁止空密码登录 
UseDNSno #关闭DNS查询
#小提醒:记得把修改后的端口号加入iptables中奥。

另外如果个人喜好用钥匙登陆的话也可以看这篇文章:使用密钥登录VPS服务器七:清空iptables,创建自己的防火墙规则

iptables -F #清空所选链。这等于把所有规则一个个的删除。
iptables -X #删除指定的用户自定义链。
iptables -Z #把所有链的包及字节的计数器清空。

vi /etc/sysconfig/iptables添加如下内容。

# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
#-A INPUT -p icmp --icmp-type 8 -s 0/0 -j DROP
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT

/etc/init.d/iptables save
chkconfig –level 345 iptables on
service iptables restart

八:精简开机自启动服务

查看自启动服务chkconfig –list|grep 3:on

wKioJlKuytXjvGgwAAGDefZgWrU556.jpg
或者运行如下命令开启需要的服务

for sun in crond rsyslog sshd network iptables;do chkconfig --level 3 $sun on;done

九:内核参数优化

查看内核默认参数
cat /proc/sys/net/ipv4/xxxx
cat /proc/sys/net/core/xxxx

vi /etc/sysctl.conf
添加如下参数

#关闭IPV6
net.ipv6.conf.all.disable_ipv6 = 1

#禁止转发
net.ipv4.ip_forward = 0

net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
kern.maxfiles = 65536
#kern.maxfilesperproc = 32768
#kern.maxfilesperproc: 1735
(maxfilesperproc网上很多资料写的是32768,除非用异步I/O或大量线程,打开这么多的文件恐怕是不太正常的。个人建议不做修改,保留默认。)

#设置端口范围
net.ipv4.ip_local_port_range = 1000 61000

#TCP发送(w)接收(r)缓存256KB,最大缓存512KB
net.core.wmem_default = 262144
net.core.rmem_default = 262144
net.core.rmem_max = 524288
net.core.wmem_max = 524288

#默认128通,可加大。定义了系统中每一个端口最大的监听队列的长度,这是个全局的参数。listen调用指定最大accept队列,当请求连接大于该值,后进的请求会被丢弃,nginx默认511就改511吧,内核默认128 保守的话也可设置为256,查阅资料建议是1000+
net.core.somaxconn = 511

#在每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目(保守点可1000)。
net.core.netdev_max_backlog = 4096

#TCP的连接管理

当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击
net.ipv4.tcp_syncookies = 1

进入SYN包的最大请求队列.默认1024.对重负载服务器,增加该值显然有好处.
net.ipv4.tcp_max_syn_backlog = 4096

详解:http://www.piao2010.com/tags/tcp_max_syn_backlog
http://www.blogjava.net/yongboy/archive/2014/08/20/417165.html

下面两个值定义了SYN的重试次数,默认5,重试次数减少可防范少量SYN攻击。
net.ipv4.tcp_synack_retries = 3
net.ipv4.tcp_syn_retries = 4

http://baiying.blog.51cto.com/1068039/702840/
http://tech.uc.cn/?p=1790

#TCP连接的保持优化
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 5

如果某个TCP连接在idle 1200秒后,内核发起probe.
如果probe 5次(每次30秒)不成功,内核才彻底放弃,认为该连接已失效。
对服务器而言,显然默认值太大. 可如上调整。

#net.ipv4.tcp_tw_reuse = 1
#时间戳
net.ipv4.tcp_timestamps = 0
时间戳详解http://blog.csdn.net/gzh0222/article/details/8000508

net.ipv4.tcp_fin_timeout = 30


下面参数可自行考虑。
#默认18W,降低只是抵御简单DOS,不要人为降低,做NAT网络干净可适当增加
#net.ipv4.tcp_max_tw_buckets = 20000
#除非得到技术专家的建议,请不要随意修改这个值默认是0。
#net.ipv4.tcp_tw_recycle = 1

net.ipv4.tcp_sack = 1
该文件表示是否启用有选择的应答(Selective Acknowledgment),这可以通过有选择地应答乱序接收到的报文来提高性能(这样可以让发送者只发送丢失的报文段);(对于广域网通信来说)这个选项应该启用,但是这会增加对 CPU 的占用。 缺省设置:1

net.ipv4.tcp_window_scaling = 1
该文件表示设置tcp/ip会话的滑动窗口大小是否可变。参数值为布尔值,为1时表示可变,为0时表示不可变。tcp/ip通常使用的窗口最大可达到65535 字节,对于高速网络,该值可能太小,这时候如果启用了该功能,可以使tcp/ip滑动窗口大小增大数个数量级,从而提高数据传输的能力。   缺省设置:1

十:设置一些全局变量

闭重启ctl-alt-delete组合键

vi /etc/init/control-alt-delete.conf
#exec /sbin/shutdown -r now "Control-Alt-Deletepressed" 

#设置自动退出终端,防止非法关闭ssh客户端造成登录进程过多,可以设置大一些,单位为秒
echo "TMOUT=3600">> /etc/profile
#历史命令记录数量设置为10条
sed -i "s/HISTSIZE=1000/HISTSIZE=10/" /etc/profile
#立即生效source /etc/profile

#centos6.5已经不自动安装sendmail了所以没必要走这一步优化
mkdir -p /server/scripts
vi /server/scripts/spool_clean.sh
#!/bin/sh
find/var/spool/clientmqueue/-typef -mtime +30|xargsrm-f

设置完成记得reboot重启生效。

内核优化里net.ipv4.tcp_tw_reuse = 1 开启此参数可能造成未知问题

net.ipv4.tcp_wmem(tcp_mem | tcp_rmem)默认情况下, 协议栈通常是按net.core.wmem_default 和net.core.wmem_max 的值来分配内存的。
net.core.wmem_default = 262144 (256KB)
net.core.rmem_default = 262144
net.core.rmem_max = 524288 (524kb)
net.core.wmem_max = 524288 (524kb)
参考:
my.oschina.net/u/162204/blog/53754
colobu.com/2014/09/18/linux-tcpip-tuning/
lvtao.net/server/sysctl.html
wenku.baidu.com/view/5ff10fbf6294dd88d0d26b73.html?re=view
360doc.com/content/14/0606/16/3300331_384326124.shtml
aixchina.net/club/viewthread.php?tid=76434
jaseywang.me/2012/05/09/%E5%85%B3%E4%BA%8E-out-of-socket-memory-%E7%9A%84%E8%A7%A3%E9%87%8A-2/
cnblogs.com/shanyou/archive/2012/01/29/2330997.html

 

 

MySQL 是一个很棒的 open source 数据库引擎,大部分的网站和博客都是由 MySQL 驱动的。MySQL 的默认安装占用的内存资源比较大(相对于一个只有 64MB 的 VPS来说),优化 MySQL 可以减少内存消耗,把更多的内存省下来留给其他程序。

MySQL 的配置文件在 /etc/mysql/my.cnf(Debian 5),为了方便调整配置,MySQL 为小资源系统提供了一个叫做 my-small.cnf 的配置文件,是给小于 32MB 内存的服务器设置的。我们可以在这个配置文件的基础上作小部分的调整。

先找到 /usr/share/doc/mysql-server-5.0/examples/my-small.cnf,然后覆盖 /etc/mysql/my.cnf(Debian)。如果是 CentOS 5 的话,路径是:/usr/share/doc/mysql-server-5.0.45/my-small.cnf,覆盖 /etc/my.cnf。

参数说明

如果不使用 BDB table 和 InnoDB table 的话,加入下面2行关闭不需要的表类型很有必要,关闭 innodb 可以省下大量内存,虽然 InnoDB 好处多多但是在一个64MB的 VPS 上并不能体现出来,并且很占内存。

skip-bdb
skip-innodb

key_buffer 是优化性能的重要参数,用来缓存 tables keys 和 indexes,增加这个值可以更好的处理索引,读和写都需要索引。这里设设置成 16K 足够了。table_cache 是所有线程打开的表的数量,增加值可以增大 MySQL 的文件描述符数量,避免频繁的打开表,原始 my-small.cnf 中 table_cache 设置成4有点小,一个 wordpress 的页面通常会涉及到10个左右的表,其他的程序比如 Drupal,MediaWiki 会涉及到更多,将table_cache改为8。

key_buffer = 16K
table_cache = 8

max_connections 是数据库最大的连接数量,可以根据自己博客/网站的访问量来定这个值。如果博客/网站经常出现:Too many connections 错误的信息说明需要增大 max_connections 的值。thread_concurrency 是最大并发线程数,通常设置为 CPU核数量×2,在 VPS 宿主机上如果服务器有2颗物理 CPU,而每颗物理 CPU 又支持 H.T 超线程(一个处理器上整合了两个逻辑处理器单元),所以实际取值为4 × 2 = 8。

如果我们在优化 php.ini 的时候设置了同时只有2个 php-cgi 运行的话,那么我们也应该只设置2个 MySQL 线程同时运行。

max_connections = 16
thread_concurrency = 2

对于博客/新闻网站来说,用得最多的就是查询,所以需要加入 query cache 的设置。query_cache_size 是执行查询所使用的缓冲大小。

query_cache_limit = 256K
query_cache_size = 4M

thread_stack 用来存放每个线程的标识信息,如线程 id,线程运行时环境等,可以通过设置 thread_stack 来决定给每个线程分配多大的内存。

sort_buffer_size 是每个需要排序的线程分配的缓冲区大小,增加该值可以加速 order by 和 group by 的操作。注意:该参数是以每个连接分配内存,也就是说,如果有16个连接,sort_buffer_size 为 64K,那么实际分配的内存为:16 × 64K = 1MB。如果设置的缓存大小无法满足需要,MySQL 会将数据写入磁盘来完成排序。因为磁盘操作和内存操作不在一个数量级,所以 sort_buffer_size 对排序的性能影响很大。

read_buffer_size 是顺序读取数据时的缓冲区大小,与 sort_buffer_size 一样,该参数分配的内存也是以每连接为单位的。read_buffer_size 是用来当需要顺序读取数据的时候,如无发使用索引的情况下的全表扫描,全索引扫描等。在这种时候,MySQL 按照数据的存储顺序依次读取数据块,每次读取的数据快首先会暂存在 read_buffer_size 中,当 buffer 空间被写满或者全部数据读取结束后,再将 buffer 中的数据返回给上层调用者,以提高效率。

read_rnd_buffer_size 是随机读取数据时的缓冲区大小,与顺序读相对应。

net_buffer_size 用来存放客户端连接线程的连接信息和返回客户端的结果集的缓存大小。当 MySQL 接到请求后,产生返回结果集时,会在返回给请求线程之前暂存在在这个缓存中,等积累到一定大小的时候才开始向客户端发送,以提高网络效率。不过,net_buffer_size 所设置的仅仅只是初始大小,MySQL 会根据实际需要自行申请更多的内存,但最大不会超过 max_allowed_packet。

sort_buffer_size = 64K
read_buffer_size = 256K
read_rnd_buffer_size = 256K
net_buffer_length = 2K
thread_stack = 64K

skip-locking用来避免 MySQL 外部锁定,减少出错几率,增强稳定性。

skip-locking

优化后配置

经优化后,my.cnf 的配置如下,top 查看 mysqld 保持在 5M 一下。

[mysqld]
port            = 3306
socket          = /var/run/mysqld/mysqld.sock
skip-locking

key_buffer = 16K
query_cache_limit = 256K
query_cache_size = 4M
max_allowed_packet = 1M
table_cache = 8

max_connections = 16
thread_concurrency = 2

sort_buffer_size = 64K
read_buffer_size = 256K
read_rnd_buffer_size = 256K
net_buffer_length = 2K
thread_stack = 64K

skip-bdb
skip-innodb

[mysqldump]
quick
max_allowed_packet = 16M

[mysql]
no-auto-rehash
#safe-updates

[isamchk]
key_buffer = 8M
sort_buffer_size = 8M

[myisamchk]
key_buffer = 8M
sort_buffer_size = 8M

[mysqlhotcopy]
interactive-timeout

内存计算公式

MySQL memory = key_buffer + max_connections *
(join_buffer + record_buffer + sort_buffer + thread_stack + tmp_table_size)

 

FROM:http://www.xiumu.org/technology/optimizing-mysql-on-vps.shtml

 

 

16十一/125

小内存VPS lnmp配置优化

环境为一台256MB内存vps,系统为CentOS6.3,使用的程序版本:
nginx 1.3.8
php 5.3.18
mysql 5.5.28
安装lnmp可参考:http://www.live-in.org/archives/1257.html

一、nginx配置
编辑配置文件:

vim /etc/nginx/nginx.conf

1、
找到:

worker_processes

改为:

worker_processes 2;

nginx运行的进程数,一般设置成和CPU的核数相同。

2、
找到:

worker_rlimit_nofile

改为:

worker_rlimit_nofile 40960;

worker_rlimit_nofile是nginx能打开文件的最大句柄数。

3、
找到:

worker_connections

改为:

worker_connections 10240;

nginx进程所允许的最大的连接数,max_clients = worker_processes * worker_connections。

4、
找到:

keepalive_timeout

改为:

keepalive_timeout 60;

设置连接超时时间为60。

5、开启gzip
找到gzip的相关参数:

gzip on;
gzip_static on;
gzip_comp_level 5;
gzip_min_length 1024;

增加并修改(相同的直接覆盖):

gzip on;
gzip_static on;
gzip_comp_level 5;
gzip_min_length 1024;
gzip_buffers 4 8k;
gzip_types text/xml text/css text/javascript application/x-javascript application/xml;
gzip_vary on;
gzip_http_version 1.1;

gzip相关压缩参数,从上到下为:
支持gzip压缩。
支持静态缓存模块。
gzip压缩等级,1压缩比最小处理速度最快,9压缩比最大但处理速度最慢。
设置允许压缩的页面最小字节数。
gzip压缩缓存,是按块大小的倍数申请内存空间,这里以8k为一块,以8k的4倍大小申请内存。
设置需要压缩的MIME类型。
vary header支持。
用于识别http协议的版本。

二、php-fpm配置

vim /etc/php-fpm.d/www.conf

以下配置是在pm = dynamic模式下的配置。
1、
找到:

pm.max_children

改为:

pm.max_children = 8;

php-fpm子进程副本创建的最大数,创建的越多并发能力越强。同时修改空闲时进程数pm.min_spare_servers和pm.max_spare_servers,不能比pm.max_children大。

2、
找到:

;pm.max_requests = 500

将注释去掉并改为:

pm.max_requests = 2000

接收多少次请求后重新建立php-fpm子进程。

PS:dynamic这种模式很像apache的prefork方式。

3、
找到:

;request_terminate_timeout = 0

将注释去掉并改为:

request_terminate_timeout = 100

设置php脚本最大执行时间。

一个nginx进程要占5~10MB内存,一个php-fpm进程要占15~25MB左右的内存。

三、nginx预防500、502、504
1、nginx 500错
nginx出现500错误,很大一部分原因是因为nginx打开的文件描述符数量限制太小导致的,可参考下面“(四)中的修改系统ulimit限制”。
nginx.conf中worker_rlimit_nofile也要改成40960。

2、nginx 502错
nginx 502 bad gateway是最常见的报错了,主要原因是php fastcgi的进程数在大并发下来不及处理请求,导致请求被丢弃。
如果有多余内存可以加大php-fpm进程数,修改max_children参数。

网上的其它办法:
部分PHP程序的执行时间超过了Nginx的等待时间,可以适当增加nginx.conf配置文件中FastCGI的timeout时间,例如
……
http
{
……
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
……
}
……

PS:nginx.conf基本结构如下,不要加错地方==

XXXXXXXX
XXXXXXXX
events{
XXXXXXXXXXXX
...
}
http{
XXX添加在这个位置XXXX
 server{
 XXXXXXXXXXXX
 ...
 }
...
}

另外修改request_terminate_timeout,控制php脚本最大运行时间可以改善该问题。php-cgi进程数不够用、php执行时间长、或者是php-cgi进程死掉,都会出现502错误。

3、nginx 504错
504 Gateway Time-out,一般是由于nginx默认的fastcgi进程响应的缓冲区太小造成的, 这将导致fastcgi进程被挂起。
增加几个fastcgi的配置:

fastcgi_buffers 4 256k;
fastcgi_buffer_size 128K;
fastcgi_busy_buffers_size 256K;
fastcgi_temp_file_write_size 256K;

四、系统相关
1、
修改网络参数

vim /etc/sysctl.conf

添加:

net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1

2、
修改系统ulimit限制

vim /etc/security/limits.conf

增加两行:

* soft nofile 40960
* hard nofile 40960


vim /etc/pam.d/login

增加如下一行:

session required pam_limits.so

在profile文件中增加一行:

echo "ulimit -SHn 40960" >> /etc/profile

重启系统生效。

五、mysql配置

vim /etc/my.cnf

由于内存较小,不使用InnoDB,还是用回mysql5.1.x的MyISAM。如果内存足够还是推荐使用InnoDB。

在[mysqld]内添加:

loose-skip-innodb
default-storage-engine = MyISAM

skip-external-locking
skip-name-resolve
skip-networking

key_buffer_size = 32M
max_allowed_packet = 2M
table_cache = 64
sort_buffer_size = 1M
net_buffer_length = 8K
read_buffer_size = 1M
read_rnd_buffer_size = 1M
myisam_sort_buffer_size = 16M
thread_cache_size = 8 //add
query_cache_size = 32M //add

六、php配置

vim /etc/php.ini

1、
找到:

zlib.output_compression = Off
;zlib.output_compression_level = -1

改为:

zlib.output_compression = On
zlib.output_compression_level = 5

开启php gzip压缩。这里和nginx gzip压缩的东西不同,nginx是压缩html,css,javascript。php gzip是用来压缩php。

2、
找到:

memory_limit = 128M

改为:

memory_limit = 32M

修改php脚本使用的最大内存数。

最后重启nginx、php-fpm、mysql:

service nginx restart
service php-fpm restart
service mysqld restart

参考资料:
http://www.ha97.com/4339.html
http://www.ha97.com/4004.html
http://blog.s135.com/post/361/
http://www.cnblogs.com/rmbteam/archive/2011/10/26/2225010.html

 

Optimizing Shadowsocks

clowwindy edited this page · 23 revisions
Clone this wiki locally

Clone in Desktop

If you see a lot of error: too many open files in your log, you should optimize your system. This tutorial applies to all shadowsocks servers (Python, libev, etc).

On Debian 7:

Create /etc/sysctl.d/local.conf with the following content:

# max open files
fs.file-max = 51200
# max read buffer
net.core.rmem_max = 67108864
# max write buffer
net.core.wmem_max = 67108864
# default read buffer
net.core.rmem_default = 65536
# default write buffer
net.core.wmem_default = 65536
# max processor input queue
net.core.netdev_max_backlog = 4096
# max backlog
net.core.somaxconn = 4096

# resist SYN flood attacks
net.ipv4.tcp_syncookies = 1
# reuse timewait sockets when safe
net.ipv4.tcp_tw_reuse = 1
# turn off fast timewait sockets recycling
net.ipv4.tcp_tw_recycle = 0
# short FIN timeout
net.ipv4.tcp_fin_timeout = 30
# short keepalive time
net.ipv4.tcp_keepalive_time = 1200
# outbound port range
net.ipv4.ip_local_port_range = 10000 65000
# max SYN backlog
net.ipv4.tcp_max_syn_backlog = 4096
# max timewait sockets held by system simultaneously
net.ipv4.tcp_max_tw_buckets = 5000
# turn on TCP Fast Open on both client and server side
net.ipv4.tcp_fastopen = 3
# TCP receive buffer
net.ipv4.tcp_rmem = 4096 87380 67108864
# TCP write buffer
net.ipv4.tcp_wmem = 4096 65536 67108864
# turn on path MTU discovery
net.ipv4.tcp_mtu_probing = 1

# for high-latency network
net.ipv4.tcp_congestion_control = hybla

# for low-latency network, use cubic instead
# net.ipv4.tcp_congestion_control = cubic

Then:

sysctl --system

Older system:

sysctl -p /etc/sysctl.d/local.conf

Warning: DO NOT ENABLE net.ipv4.tcp_tw_recycle!!! See this article.

If you use Supervisor, Make sure you have the following line in /etc/default/supervisor. Once you added that line, restart Supervisor (service stop supervisor && service start supervisor).

ulimit -n 51200

If you run shadowsocks in the background in other ways, make sure to add ulimit -n 51200 in your init script.

After optimizing, a busy Shadowsocks server that handles thousands of connections, takes about 30MB memory and 10% CPU. Notice that at the same time, Linux kernel usually uses >100MB RAM to hold buffer and cache for those connections. By using the sysctl config above, you are trading off RAM for speed. If you want to use less RAM, reduce the size of rmem and wmem.

if_eth0-day

fw_conntrack-day

cpu-day

proc_mem-day

Before & after:

cc