2013年十二月月 发布的文章

一键安装拨号vpn pptp脚本

一些特殊注意事项

(1) ppp-2.4.4-14.1.rhel5.x86_64.rpm
PPTP需要PPP的支持,一般情况下linux系统都已安装有PPP软件包,最好安装较新的ppp软件包,用Uvh这个参数来更新系统的PPP组件。也可以用yum –y instll ppp命令安装。

(2) pptpd-1.3.4-2.rhel5.x86_64.rpm (pptpd服务软件)

(3) dkms-2.0.17.5-1.noarch.rpm CentOS5x/RHEL5x(内核支持mppe)不用安装
DKMS全称是 Dynamic Kernel Module Support,它可以帮我们维护内核外的这些驱动程序,在内核版本变动之后可以自动重新生成新的模块。

(4) kernel_ppp_mppe-1.0.2-3dkms.noarch(MPPE的内核补丁),CentOS5x/RHEL5x(内核支持mppe)不用安装

(5) 在ADSL拨号环境中由于PPP包头占用8字节,MTU为1492字节,MSS为1452字节,如不能正确设置会导致网络不正常,可以通过TCPMSS模块调整MSS大小
关于iptables的:MASQUERADE
假如当前系统用的是ADSL动态拨号方式,那么每次拨号,出口ip192.168.5.3都会改变
而且改变的幅度很大,不一定是192.168.5.3到192.168.5.5范围内的地址
这个时候如果按照现在的方式来配置iptables就会出现问题了
因为每次拨号后,服务器地址都会变化,而iptables规则内的ip是不会随着自动变化的
每次地址变化后都必须手工修改一次iptables,把规则里边的固定ip改成新的ip
这样是非常不好用的
MASQUERADE就是针对这种场景而设计的,他的作用是,从服务器的网卡上,自动获取当前ip地址来做NAT
比如下边的命令:

iptables -t nat -A POSTROUTING -s 10.8.0.0/255.255.255.0 -o eth0 -j MASQUERADE

如此配置的话,不用指定SNAT的目标ip了
不管现在eth0的出口获得了怎样的动态ip,MASQUERADE会自动读取eth0现在的ip地址然后做SNAT出去
这样就实现了很好的动态SNAT地址转换

注:
对于MASQUERADE,只是计算机的负荷稍微多一点。因为对每个匹配的包,MASQUERADE都要查找可用的IP地址,而不象SNAT用的IP地址 是配置好的。当然,这也有好处,就是我们可以使用通过PPP、 PPPOE、SLIP等拨号得到的地址,这些地址可是由ISP的DHCP随机分配的。

#!/bin/bash
wget https://fastlnmp.googlecode.com/files/dkms-2.0.17.5-1.noarch.rpm -p /usr/local/src/
wget https://fastlnmp.googlecode.com/files/ppp-2.4.4-9.0.rhel5.i386.rpm -p /usr/local/src/
wget https://acelnmp.googlecode.com/files/pptpd-1.3.4-2.rhel5.x86_64.rpm -p /usr/local/src/
yum -y install make libpcap iptables gcc-c++ logrotate tar cpio perl pam tcp_wrappers
rpm -ivh dkms-2.0.17.5-1.noarch.rpm
rpm -Uvh ppp-2.4.4-9.0.rhel5.i386.rpm
rpm -ivh pptpd-1.3.4-2.rhel5.x86_64.rpm
#mknod /dev/ppp c 108 0
echo 1 > /proc/sys/net/ipv4/ip_forward
#echo “mknod /dev/ppp c 108 0” >> /etc/rc.local
echo “echo 1 > /proc/sys/net/ipv4/ip_forward” >> /etc/rc.local
echo “localip 192.168.88.1” >> /etc/pptpd.conf
echo “remoteip 192.168.88.50-254” >> /etc/pptpd.conf
echo “ms-dns 8.8.8.8” >> /etc/ppp/options.pptpd
echo “ms-dns 8.8.4.4” >> /etc/ppp/options.pptpd
pass=`openssl rand 6 -base64`
if [ “$1” != “” ]
then pass=$1
fi
echo “vpn pptpd ${pass} *” >> /etc/ppp/chap-secrets
iptables -t nat -A POSTROUTING -s 192.168.88.0/255.255.255.0 -o eth0 -j MASQUERADE
iptables -A FORWARD -p tcp –syn -s 192.168.88.0/24 -j TCPMSS –set-mss 1356
service iptables save
chkconfig iptables on
chkconfig pptpd on
service iptables start
service pptpd start
echo “VPN service is installed, your VPN username is vpn, VPN password is ${pass}”

 

转自http://blog.coocla.org/185.html

apache 禁止某个IP访问

定位到你的Apache安装目录下的conf文件夹,

找到httdp.conf文件,
加入如下内容:


Options Indexes FollowSymLinks
AllowOverride None
Order  deny,allow
Deny from 192.168.1.99

解释如下:
1、
,这里“你的网站根目录”是在这个httdp.conf文件里,
使用
DocumentRoot “你的网站根目录” 语句定义的 双引号 “……” 里的值,比如说/var/www/html之类的。
2、AllowOverride None
# AllowOverride 这个属性有两个值,None和All
当 AllowOverride 的值为All时,网站根目录里面的 .htaccess文件才能生效。
至于什么是.htaccess文件,请自己Google。
3、

Order deny,allow
Deny from 192.168.1.99

使用这个命令来达到屏蔽IP的作用,类似的用法还有:

#  允许所有主机访问
Order deny,allow
Allow from All
#  禁止所有主机访问
Order deny,allow
Deny from All

把上面的All改成指定的IP即可达到屏蔽某个IP的效果。

屏蔽IP端也一样,比如说屏蔽192.168.1.123这个IP所在的192.168.1这个IP段,只需要这样写:

#  禁止192.168.1这个IP段访问
Order deny,allow
Deny from 192.168.1.123/24

另注:

当书写为:

Order deny,allow
Deny from All
Allow from 192.168.1.100

此时是禁止除了192.168.1.100这个IP之外的所有IP访问,也就是Deny,Allow这两个命令,在最后一个命令完成时才确定允许那些IP,禁止哪些IP。

请举一反三:

Order deny,allow
Allow from All
Deny from 192.168.1.100

没错,这段的意思是 允许除了192.168.1.100之外的所有IP访问。

iftop CentOS流量监控工具

安装方法1编译安装

如果采用编译安装可以到iftop官网下载最新的源码包。

安装前需要已经安装好基本的编译所需的环境,比如make、gcc、autoconf等。安装iftop还需要安装libpcap和libcurses。

CentOS上安装所需依赖包:

yum install flex byacc  libpcap ncurses ncurses-devel libpcap-devel

下载iftop

wget http://www.ex-parrot.com/pdw/iftop/download/iftop-0.17.tar.gz

tar zxvf iftop-0.17.tar.gz

cd iftop-0.17

./configure

make && make install

安装方法2:yum安装

直接省略上面的步骤

yum install flex byacc  libpcap ncurses ncurses-devel

wget ftp://fr2.rpmfind.net/linux/dag/redhat/el5/en/i386/dag/RPMS/iftop-0.17-1.el5.rf.i386.rpm

rpm -ivh iftop-0.17-1.el5.rf.i386.rpm

四、运行iftop

直接运行: iftop

效果如下图:

17436A17-9C44-46BC-AC17-07FE7715C932

五、相关参数及说明

1iftop界面相关说明

界面上面显示的是类似刻度尺的刻度范围,为显示流量图形的长条作标尺用的。

中间的<= =>这两个左右箭头,表示的是流量的方向。

TX:发送流量
RX:接收流量
TOTAL:总流量
Cumm:运行iftop到目前时间的总流量
peak:流量峰值
rates:分别表示过去 2s 10s 40s 的平均流量

2iftop相关参数

常用的参数

-i设定监测的网卡,如:# iftop -i eth1

-B 以bytes为单位显示流量(默认是bits),如:# iftop -B

-n使host信息默认直接都显示IP,如:# iftop -n

-N使端口信息默认直接都显示端口号,如: # iftop -N

-F显示特定网段的进出流量,如# iftop -F 10.10.1.0/24或# iftop -F 10.10.1.0/255.255.255.0

-h(display this message),帮助,显示参数信息

-p使用这个参数后,中间的列表显示的本地主机信息,出现了本机以外的IP信息;

-b使流量图形条默认就显示;

-f这个暂时还不太会用,过滤计算包用的;

-P使host信息及端口信息默认就都显示;

-m设置界面最上边的刻度的最大值,刻度分五个大段显示,例:# iftop -m 100M

进入iftop画面后的一些操作命令(注意大小写)

按h切换是否显示帮助;

按n切换显示本机的IP或主机名;

按s切换是否显示本机的host信息;

按d切换是否显示远端目标主机的host信息;

按t切换显示格式为2行/1行/只显示发送流量/只显示接收流量;

按N切换显示端口号或端口服务名称;

按S切换是否显示本机的端口信息;

按D切换是否显示远端目标主机的端口信息;

按p切换是否显示端口信息;

按P切换暂停/继续显示;

按b切换是否显示平均流量图形条;

按B切换计算2秒或10秒或40秒内的平均流量;

按T切换是否显示每个连接的总流量;

按l打开屏幕过滤功能,输入要过滤的字符,比如ip,按回车后,屏幕就只显示这个IP相关的流量信息;

按L切换显示画面上边的刻度;刻度不同,流量图形条会有变化;

按j或按k可以向上或向下滚动屏幕显示的连接记录;

按1或2或3可以根据右侧显示的三列流量数据进行排序;

按<根据左边的本机名或IP排序;

按>根据远端目标主机的主机名或IP排序;

按o切换是否固定只显示当前的连接;

按f可以编辑过滤代码,这是翻译过来的说法,我还没用过这个!

按!可以使用shell命令,这个没用过!没搞明白啥命令在这好用呢!

按q退出监控。

六、常见问题

1、make: yacc: Command not found
make: *** [grammar.c] Error 127

解决方法:apt-get install byacc   /   yum install byacc

2、configure: error: Curses! Foiled again!
(Can’t find a curses library supporting mvchgat.)
Consider installing ncurses.

解决方法:apt-get install libncurses5-dev  /    yum  install ncurses-deve

Centos PPTP VPN yum安装配置

通过 yum 方式安装的好处是便于管理,可以通过 yum update 命令来升级程序版本。
安装 ppp 和 iptalbes
yum install ppp iptables
安装 pptpd
加入 yum 源
rpm -Uvh http://poptop.sourceforge.net/yum/stable/rhel6/pptp-release-current.noarch.rpm
安装 pptpd
yum install pptpd
——————————— 设置 ————————————
开启路由转发
vim  /etc/sysctl.conf
修改
net.ipv4.ip_forward = 1
执行:
/sbin/sysctl -p 让修改的内核参数生效
配置
vim /etc/ppp/options.pptpd
修改:
ms-dns 4.2.2.1 当地能用的dns
ms-dns 4.2.2.2
vim  /etc/pptpd.conf
修改 :
localip 10.8.8.1 为vpn管道的ip (VPN主机IP)
remoteip 10.8.8.2-245 为给客户端连接分配的ip地址范围
开机启动、运行
chkconfig pptpd on
service pptpd start
添加账号
echo -e ‘vpntest * vpntestpassword *’ >> /etc/ppp/chap-secrets
注:chap-secrets保存的信息客户端连接信息依次是:用户名,服务名,密码,允许的ip。服务名在options.pptpd的name定义,默认为pptpd
iptables 配置
chkconfig iptables on
/sbin/iptables -A INPUT -p tcp –dport 1723 -j ACCEPT
/sbin/iptables -A INPUT -p tcp –dport 47 -j ACCEPT
/sbin/iptables -A INPUT -p gre -j ACCEPT
iptables -A POSTROUTING -t nat -s 10.10.10.0/24 -o eth0 -j MASQUERADE
service iptables start

 

Linux 根据进程(PID)查看文件路径

在Linux 底下,使用 top 命令可以监控系统的进程情况,但是很多时候,我们需要根据进程的PID来找到对应的文件路径,例如图中的 29310 这个进程,如何知道 httpd 这个进程的文件路径呢?

ls -l /proc/29310/cwd    列出29310 就是httpd 这个进程的工作目录

ls -l /proce/29310/exe    列出29310 这个进程的文件路径

pwdx 29310    可以直接获得该进程的工作目录

thum-4a7a9004c068615d2de5c30d0da635b520100306091818

转自:http://www.ofme.cn/post-39.html

Nginx安装配置

Nginx作为一个后起之秀,他的迷人之处已经让很多人都投入了他的怀抱。配置简单,实现原理简单。做一个负载平衡的再好不过了。

其原理:

简单介绍一下他的安装及配置过程

官方网站
http://wiki.codemongers.com/Main

一、依赖的程序

1. gzip module requires zlib library
2. rewrite module requires pcre library
3. ssl support requires openssl library

二、安装
./configure
make
make install

默认安装的路径是/usr/local/nginx

更多的安装配置
./configure –prefix=/usr/local/nginx
–with-openssl=/usr/include (启用ssl)
–with-pcre=/usr/include/pcre/ (启用正规表达式)
–with-http_stub_status_module (安装可以查看nginx状态的程序)
–with-http_memcached_module (启用memcache缓存)
–with-http_rewrite_module (启用支持url重写)

三、启动及重启

启动:nginx
重启:kill -HUP `cat /usr/local/nginx/logs/nginx.pid`
测试配置文件:nginx -t

简单吧,安装,启动都比较方便。

四、配置文件
http://wiki.codemongers.com/NginxFullExample

#运行用户
user  nobody nobody;
#启动进程
worker_processes  5;
#全局错误日志及PID文件
error_log  logs/error.log notice;
pid        logs/nginx.pid;
#工作模式及连接数上限
events {
  #工作模式有:select(标准模式),poll(标准模式),kqueue(高效模式,适用FreeBSD 4.1+, OpenBSD 2.9+, NetBSD 2.0 and MacOS X),
  #epoll(高效模式,本例用的。适用Linux 2.6+,SuSE 8.2,),/dev/poll(高效模式,适用Solaris 7 11/99+, HP/UX 11.22+ (eventport), IRIX 6.5.15+ 和 Tru64 UNIX 5.1A+)
  use epoll;
  worker_connections      1024;
}
#设定http服务器,利用它的反向代理功能提供负载均衡支持
http {
  #设定mime类型
  include      conf/mime.types;
  default_type  application/octet-stream;
  #设定日志格式
  log_format main        '$remote_addr - $remote_user [$time_local] '
                         '"$request" $status $bytes_sent '
                         '"$http_referer" "$http_user_agent" '
                         '"$gzip_ratio"';
  log_format download    '$remote_addr - $remote_user [$time_local] '
                         '"$request" $status $bytes_sent '
                         '"$http_referer" "$http_user_agent" '
                         '"$http_range" "$sent_http_content_range"';
  #设定请求缓冲
  client_header_buffer_size    10k;
  large_client_header_buffers  4 4k;
  
  #开启gzip模块,要求安装gzip 在运行./config时要指定
  gzip on;
  gzip_min_length  1100;
  gzip_buffers    4 8k;
  gzip_types      text/plain;
  output_buffers  1 32k;
  postpone_output  1460;
  
  #设定访问日志
  access_log  logs/access.log  main;
  client_header_timeout  3m;
  client_body_timeout    3m;
  send_timeout          3m;
  sendfile                on;
  tcp_nopush              on;
  tcp_nodelay            on;
  keepalive_timeout  65;
  
  #设定负载均衡的服务器列表
  upstream backserver {
  #weigth参数表示权值,权值越高被分配到的几率越大
  #本例是指在同一台服务器,多台服务器改变ip即可
  server 127.0.0.1:8081 weight=5;
  server 127.0.0.1:8082;
  server 127.0.0.1:8083;
  }
  #设定虚拟主机,默认为监听80端口,改成其他端口会出现问题
  server {
    listen         80;
    server_name    test.com www.test.com;
    charset utf8;
    #设定本虚拟主机的访问日志
    access_log  logs/test.com.log  main;
    #如果访问 /images/*, /js/*, /css/* 资源,则直接取本地文件,不用转发。但如果文件较多效果不是太好。
    location ~ ^/(images|js|css)/  {
        root    /usr/local/testweb;
        expires 30m;
    }
    
    #对 "/" 启用负载均衡
    location / {
       proxy_pass      http://backserver;
       proxy_redirect          off;
       proxy_set_header        Host $host;
       proxy_set_header        X-Real-IP $remote_addr;
       proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
       client_max_body_size    10m;
       client_body_buffer_size 128k;
       proxy_connect_timeout  90;
       proxy_send_timeout      90;
       proxy_read_timeout      90;
       proxy_buffer_size      4k;
       proxy_buffers          4 32k;
       proxy_busy_buffers_size 64k;
       proxy_temp_file_write_size 64k;
    }
    #设定查看Nginx状态的地址,在运行./config 要指定,默认是不安装的。
    location /NginxStatus {
       stub_status            on;
       access_log              on;
       auth_basic              "NginxStatus";
       #是否要通过用户名和密码访问,测试时可以不加上。conf/htpasswd 文件的内容用 apache 提供的 htpasswd 工具来产生即可       
       #auth_basic_user_file  conf/htpasswd;
    }
}

                

Redis 安装配置

一、 下载redis最新版本2.2.14

cd /usr/local/src

wget –c http://redis.googlecode.com/files/redis-2.2.14.tar.gz

二、 编译安装redis

tar zxvf redis-2.2.14.tar.gz

cd redis-2.2.14

make

make命令执行完成后,会在src目录下生成5个可执行文件,分别是redis-server、redis-cli、redis-benchmark、redis-check-aof、redis-check-dump,它们的作用如下:
redis-server:Redis服务器的daemon启动程序
redis-cli:Redis命令行操作工具。当然,你也可以用telnet根据其纯文本协议来操作
redis-benchmark:Redis性能测试工具,测试Redis在你的系统及你的配置下的读写性能
redis-check-aof:更新日志检查

redis-check-dump:用于本地数据库检查

安装:

make prefix=/usr/local install

 

三、 配置 Redis

 

mkdir /etc/redis

cp redis.conf /etc/redis/redis.conf

mkdir  /var/lib/redis

 

1. redis.conf 配置参数:

#是否作为守护进程运行

daemonize yes

#如以后台进程运行,则需指定一个pid,默认为/var/run/redis.pid

pidfile redis.pid

#绑定主机IP,默认值为127.0.0.1

#bind 127.0.0.1

#Redis默认监听端口

port 3721

#客户端闲置多少秒后,断开连接,默认为300(秒)

timeout 300

#日志记录等级,有4个可选值,debug,verbose(默认值),notice,warning

loglevel verbose

#指定日志输出的文件名,默认值为stdout,也可设为/dev/null屏蔽日志

logfile stdout

#可用数据库数,默认值为16,默认数据库为0

databases 16

#保存数据到disk的策略

#当有一条Keys数据被改变是,900秒刷新到disk一次

save 900 1

#当有10条Keys数据被改变时,300秒刷新到disk一次

save 300 10

#当有1w条keys数据被改变时,60秒刷新到disk一次

save 60 10000

#当dump .rdb数据库的时候是否压缩数据对象

rdbcompression yes

#本地数据库文件名,默认值为dump.rdb

dbfilename dump.rdb

#本地数据库存放路径,默认值为 ./

dir /var/lib/redis/

########### Replication #####################

#Redis的复制配置

# slaveof <masterip> <masterport> 当本机为从服务时,设置主服务的IP及端口

# masterauth <master-password> 当本机为从服务时,设置主服务的连接密码

#连接密码

# requirepass foobared

#最大客户端连接数,默认不限制

# maxclients 128

#最大内存使用设置,达到最大内存设置后,Redis会先尝试清除已到期或即将到期的Key,当此方法处理后,任到达最大内存设置,将无法再进行写入操作。

# maxmemory <bytes>

#是否在每次更新操作后进行日志记录,如果不开启,可能会在断电时导致一段时间内的数据丢失。因为redis本身同步数据文件是按上面save条件来同步的,所以有的数据会在一段时间内只存在于内存中。默认值为no

appendonly no

#更新日志文件名,默认值为appendonly.aof

#appendfilename

#更新日志条件,共有3个可选值。no表示等操作系统进行数据缓存同步到磁盘,always表示每次更新操作后手动调用fsync()将数据写到磁盘,everysec表示每秒同步一次(默认值)。

# appendfsync always

appendfsync everysec

# appendfsync no

################ VIRTUAL MEMORY ###########

#是否开启VM功能,默认值为no

vm-enabled no

# vm-enabled yes

#虚拟内存文件路径,默认值为/tmp/redis.swap,不可多个Redis实例共享

vm-swap-file /tmp/redis.swap

#将所有大于vm-max-memory的数据存入虚拟内存,无论vm-max-memory设置多小,所有索引数据都是内存存储的 (Redis的索引数据就是keys),也就是说,当vm-max-memory设置为0的时候,其实是所有value都存在于磁盘。默认值为0。

vm-max-memory 0

vm-page-size 32

vm-pages 134217728

vm-max-threads 4

############# ADVANCED CONFIG ###############

glueoutputbuf yes

hash-max-zipmap-entries 64

hash-max-zipmap-value 512

#是否重置Hash表

activerehashing yes

注意:Redis官方文档对VM的使用提出了一些建议:

  • 当你的key很小而value很大时,使用VM的效果会比较好.因为这样节约的内存比较大.

  • 当你的key不小时,可以考虑使用一些非常方法将很大的key变成很大的value,比如你可以考虑将key,value组合成一个新的value.

  • 最好使用linux ext3 等对稀疏文件支持比较好的文件系统保存你的swap文件.

  • vm-max-threads这个参数,可以设置访问swap文件的线程数,设置最好不要超过机器的核数.如果设置为0,那么所有对swap文件的操作都是串行的.可能会造成比较长时间的延迟,但是对数据完整性有很好的保证.

 

2. 调整系统内核参数

如果内存情况比较紧张的话,需要设定内核参数:

echo 1 > /proc/sys/vm/overcommit_memory

这里说一下这个配置的含义:/proc/sys/vm/overcommit_memory
该文件指定了内核针对内存分配的策略,其值可以是0、1、2。
0,表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。
1,表示内核允许分配所有的物理内存,而不管当前的内存状态如何。
2,表示内核允许分配超过所有物理内存和交换空间总和的内存
Redis在dump数据的时候,会fork出一个子进程,理论上child进程所占用的内存和parent是一样的,比如parent占用的内存为 8G,这个时候也要同样分配8G的内存给child, 如果内存无法负担,往往会造成redis服务器的down机或者IO负载过高,效率下降。所以这里比较优化的内存分配策略应该设置为 1(表示内核允许分配所有的物理内存,而不管当前的内存状态如何)

四. 运行 Redis

 

1. 运行服务

redis-server /etc/redis/redis.conf

即可在后台启动redis服务,确认运行了之后,可以用redis-benchmark命令测试看看,还可以通过redis-cli命令实际操作一下,比如:

redis-cli set foo bar

OK

redis-cli get foo

bar

2. 关闭服务

redis-cli shutdown

如果端口变化可以指定端口:

redis-cli -p 6380 shutdown

3. 保存/备份

数据备份可以通过定期备份该文件实现。
因为redis是异步写入磁盘的,如果要让内存中的数据马上写入硬盘可以执行如下命令:
redis-cli save 或者 redis-cli -p 6380 save(指定端口)
注意,以上部署操作需要具备一定的权限,比如复制和设定内核参数等。
执行redis-benchmark命令时也会将内存数据写入硬盘。

4. 同步机制

redis实现的同步机制相对简单,缺少同步机制常见的check point和校验机制。
在运行时,如果master -> slave同步请求转发被丢弃, slave将无法恢复该请求的相关信息,直到slave重启时从master全量加载数据时才能修复。因此,建议使用redis尽量利用其 key/value和value支持多种类型的特性,存储一些相对不重要的数据。

五. 自启动

在/etc/rc.local文件中添加,使其开机自启动

echo “/usr/local/redis/src/redis-server /etc/redis/redis.conf” >> /etc/rc.local

或者:

从此处下载脚本  下载

声明:此脚本来自网络,经过简单修改,已测,可用。

用这个脚本管理之前,需要先配置下面的内核参数,否则Redis脚本在重启或停止redis时,将会报错,并且不能自动在停止服务前同步数据到磁盘上:

vi /etc/sysctl.conf

vm.overcommit_memory = 1

然后应用生效:
sysctl -p

然后增加服务并开机自启动:

chmod 755 /etc/init.d/redis
chkconfig –add redis
chkconfig –level 345 redis on
chkconfig –list redis

高并发、大流量网卡调优

1、Broadcom的网卡建议关闭GRO功能

ethtool-K eth0 gro off
ethtool-K eth1 gro off
ethtool-K eth2 gro off
ethtool-K eth3 gro off

2、关闭irqbalance服务并手动分配网卡中断

service irqbalance stop
chkconfig irqbalance off

# 查看网卡中断号

grepethx /proc/interrupts

# 分配到每颗颗CPU核上

cat/proc/irq/{84,85,86,87,88,89,90,91,92,93}/smp_affinity(下面echo的值从此获取)
echo1 > /proc/irq/84/smp_affinity
echo2 > /proc/irq/85/smp_affinity
echo4 > /proc/irq/86/smp_affinity
echo8 > /proc/irq/87/smp_affinity
echo10 > /proc/irq/88/smp_affinity
echo20 > /proc/irq/89/smp_affinity
echo40 > /proc/irq/90/smp_affinity
echo80 > /proc/irq/91/smp_affinity
echo100 > /proc/irq/92/smp_affinity
echo200 > /proc/irq/93/smp_affinity

3、开启网卡的RPS功能 (Linux内核2.6.38或以上版本支持)

# Enable RPS (Receive Packet Steering)
rfc=4096
cc=$(grep-c processor /proc/cpuinfo)
rsfe=$(echo$cc*$rfc | bc)
sysctl -w net.core.rps_sock_flow_entries=$rsfe
forfileRps in$(ls/sys/class/net/eth*/queues/rx-*/rps_cpus)
do
echofff > $fileRps
done
forfileRfc in$(ls/sys/class/net/eth*/queues/rx-*/rps_flow_cnt)
do
echo$rfc > $fileRfc
done
tail/sys/class/net/eth*/queues/rx-*/{rps_cpus,rps_flow_cnt}

献上一个完整的脚本:

vi/opt/sbin/change_irq.sh
#!/bin/bash
ethtool-K eth0 gro off
ethtool-K eth1 gro off
ethtool-K eth2 gro off
ethtool-K eth3 gro off
service irqbalance stop
chkconfig irqbalance off
cat/proc/irq/{84,85,86,87,88,89,90,91,92,93}/smp_affinity
echo1 > /proc/irq/84/smp_affinity
echo2 > /proc/irq/85/smp_affinity
echo4 > /proc/irq/86/smp_affinity
echo8 > /proc/irq/87/smp_affinity
echo10 > /proc/irq/88/smp_affinity
echo20 > /proc/irq/89/smp_affinity
echo40 > /proc/irq/90/smp_affinity
echo80 > /proc/irq/91/smp_affinity
echo100 > /proc/irq/92/smp_affinity
echo200 > /proc/irq/93/smp_affinity
# Enable RPS (Receive Packet Steering)
rfc=4096
cc=$(grep-c processor /proc/cpuinfo)
rsfe=$(echo$cc*$rfc | bc)
sysctl -w net.core.rps_sock_flow_entries=$rsfe
forfileRps in$(ls/sys/class/net/eth*/queues/rx-*/rps_cpus)
do
echofff > $fileRps
done
forfileRfc in$(ls/sys/class/net/eth*/queues/rx-*/rps_flow_cnt)
do
echo$rfc > $fileRfc
done
tail/sys/class/net/eth*/queues/rx-*/{rps_cpus,rps_flow_cnt}
chmod+x /opt/sbin/change_irq.sh
echo"/opt/sbin/change_irq.sh">> /etc/rc.local

PS:记得修改网卡中断号,别直接拿来用哦