linux下进程优先级调整nice详解

linux renice 命令详解
功能说明:调整程序优先级。
语  法:renice [优先等级][-g <程序群组名称>…][-p <程序识别码>…][-u <用户名称>…]
补充说明:renice指令可重新调整程序执行的优先权等级。预设是以程序识别码指定程序调整其优先权,您亦可以指定程序群组或用户名称调整优先权等级,并修改所有隶属于该程序群组或用户的程序的优先权。等级范围从-20–19,只有系统管理者可以改变其他用户程序的优先权,也仅有系统管理者可以设置负数等级。
参  数:
-g <程序群组名称>  使用程序群组名称,修改所有隶属于该程序群组的程序的优先权。
-p <程序识别码>  改变该程序的优先权等级,此参数为预设值。
-u <用户名称>  指定用户名称,修改所有隶属于该用户的程序的优先权。

一开始执行程式就立即给予一个特定的 nice 值:用 nice 命令;
调整某个已经存在的 PID 的 nice 值:用 renice 命令。
推荐阅读一:linux进程cpu资源分配命令nice,renice,taskset
进程cpu资源分配就是指进程的优先权(priority)。优先权高的进程有优先执行权利。配置进程优先权对多任务环境的linux很有用,可以改善系统性能。还可以把进程运行到指定的CPU上,这样一来,把不重要的进程安排到某个CPU,可以大大改善系统整体性能。
一、先看系统进程:
PR 就是 Priority 的简写,而 NI 是 nice 的简写。这两个值决定了PR的值,PR越小,进程优先权就越高,就越“优先执行”。换算公式为:PR(new) = PR(old) + NI
—————————————————————————
二、修改进程优先级的命令主要有两个:nice,renice
1、一开始执行程序就指定nice值:nice
Java代码
nice -n -5 /usr/local/mysql/bin/mysqld_safe &

linux nice 命令详解
功能说明:设置优先权。
语  法:nice [-n <优先等级>][–help][–version][执行指令]
补充说明:nice指令可以改变程序执行的优先权等级。
参  数:-n<优先等级>或-<优先等级>或–adjustment=<优先等级>  设置欲执行的指令的优先权等级。等级的范围从-20-19,其中-20最高,19最低,只有系统管理者可以设置负数的等级。
–help  在线帮助。
–version  显示版本信息。
—————————————————————————
2.1、调整已存在进程的nice:renice

Java代码
renice -5 -p 5200
#PID为5200的进程nice设为-5

linux renice 命令详解
功能说明:调整优先权。
语  法:renice [优先等级][-g <程序群组名称>…][-p <程序识别码>…][-u <用户名称>…]
补充说明:renice指令可重新调整程序执行的优先权等级。预设是以程序识别码指定程序调整其优先权,您亦可以指定程序群组或用户名称调整优先权等级,并修改所有隶属于该程序群组或用户的程序的优先权。等级范围从-20–19,只有系统管理者可以改变其他用户程序的优先权,也仅有系统管理者可以设置负数等级。
参  数:
-g <程序群组名称>  使用程序群组名称,修改所有隶属于该程序群组的程序的优先权。
-p <程序识别码>  改变该程序的优先权等级,此参数为预设值。
-u <用户名称>  指定用户名称,修改所有隶属于该用户的程序的优先权。
2.2、也可以用top命令更改已存在进程的nice:

Java代码
top
#进入top后按”r”–>输入进程PID–>输入nice值
三、把进程运行到指定CPU(即修改进程的”CPU亲和性”):taskset
两个名词
SMP (Symmetrical Multi-Processing):指在一个计算机上汇集了一组处理器(多CPU),各CPU之间共享内存子系统以及总线结构。
CPU affinity:中文唤作“CPU亲和性”,是指在CMP架构下,能够将一个或多个进程绑定到一个或多个处理器上运行。
请先确定你的cpu核心及命名(例如四个核心:0,1,2,3):cat /proc/cpuinfo

Java代码
taskset -cp 1 5200
#把PID为5200的进程运行到CPU#1上
#也可以在启动进程时指定:
taskset -c 1 /etc/init.d/mysql start

关于程序的执行顺序:

现在的系统都支持多任务处理,那么多个工作是如何进行的呢? 其实每个工作都会进入到 CPU 的工作排程当中,并等待 CPU 来执行, 而 CPU 会根据每个工作的优先执行序 (priority) 来判断谁比较重要, 所以某个工作就可能会比较优先被执行完毕啦!

也就是说, Linux 系统中,每个 process 都会拥有一个所谓的‘优先执行序 (priority)’的属性, 利用该属性来让 CPU 判断那个工作是比较重要的,那个工作在一群工作当中就会优先被执行, 也让系统资源可以分配的更恰当。我们可以使用 ps 还观察优先执行序:
[root@linux ~]# ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
0 S 0 18851 18827 0 77 0 – 1302 wait pts/0 00:00:00 su
4 S 0 18852 18851 0 76 0 – 1349 wait pts/0 00:00:00 bash
4 R 0 19510 18852 0 76 0 – 1111 – pts/0 00:00:00 ps
其中,那个 PRI 就是 Priority 的简写,而 NI 是 nice 的简写,这两个东西是凑在一起才产生目前的 PRI 值的! PRI 越小时,代表该程序可以具有‘越早被优先执行’的意思,只是 PRI 是由系统动态产生的, 并不会是一直固定的值喔。至于那个 NI (nice) 则是我们操作值额外给予的一个数值, 他可以影响 PRI 的值,基本上,他的相关性是这样的:
* PRI(new) = PRI(old) + nice
不过您要特别留意到,如果原本的 PRI 是 50 ,并不是我们给予一个 nice = 5 ,就会让 PRI 变成 55 喔! 因为 PRI 是系统‘动态’决定的,所以,虽然 nice 值是可以影响 PRI ,不过, 最终的 PRI 仍是要经过系统分析后才会决定的。另外, nice 值是有正负的喔,而既然 PRI 越小越早被执行, 所以,当 nice 值为负值时,那么该程序就会降低 PRI 值,亦即会变的较优先被处理。

常用的Linux系统查看系统信息命令

[root@server ~] # uname –a                                             # 查看内核/操作系统/CPU信息的linux系统信息命令
[root@server ~] # head -n 1 /etc/issue                           # 查看操作系统版本,是数字1不是字母L
[root@server ~] # cat /proc/cpuinfo                               # 查看CPU信息的linux系统信息命令
[root@server ~] # hostname                                             # 查看计算机名的linux系统信息命令
[root@server ~] # lspci -tv                                                 # 列出所有PCI设备
[root@server ~] # lsusb -tv                                                # 列出所有USB设备的linux系统信息命令
[root@server ~] # lsmod                                                    # 列出加载的内核模块
[root@server ~] # env                                                         # 查看环境变量资源
[root@server ~] # free -m                                                   # 查看内存使用量和交换区使用量
[root@server ~] # df -h                                                       # 查看各分区使用情况
[root@server ~] # du -sh                                                    # 查看指定目录的大小
[root@server ~] # grep MemTotal /proc/meminfo     # 查看内存总量
[root@server ~] # grep MemFree /proc/meminfo       # 查看空闲内存量
[root@server ~] # uptime                                                   # 查看系统运行时间、用户数、负载
[root@server ~] # cat /proc/loadavg                               # 查看系统负载磁盘和分区
[root@server ~] # mount | column -t                               # 查看挂接的分区状态
[root@server ~] # fdisk -l                                                    # 查看所有分区
[root@server ~] # swapon -s                                              # 查看所有交换分区
[root@server ~] # hdparm -i /dev/hda                            # 查看磁盘参数(仅适用于IDE设备)
[root@server ~] # dmesg | grep IDE                                 # 查看启动时IDE设备检测状况网络
[root@server ~] # ifconfig                                                   # 查看所有网络接口的属性
[root@server ~] # iptables -L                                              # 查看防火墙设置
[root@server ~] # route -n                                                   # 查看路由表
[root@server ~] # netstat -lntp                                           # 查看所有监听端口
[root@server ~] # netstat -antp                                          # 查看所有已经建立的连接
[root@server ~] # netstat -s                                                 # 查看网络统计信息进程
[root@server ~] # ps -ef                                                        # 查看所有进程
[root@server ~] # top                                                            # 实时显示进程状态用户
[root@server ~] # w                                                               # 查看活动用户
[root@server ~] # id                                                               # 查看指定用户信息
[root@server ~] # last                                                            # 查看用户登录日志
[root@server ~] # cut -d: -f1 /etc/passwd                         # 查看系统所有用户
[root@server ~] # cut -d: -f1 /etc/group                            # 查看系统所有组
[root@server ~] # crontab -l                                                 # 查看当前用户的计划任务服务
[root@server ~] # chkconfig –list                                        # 列出所有系统服务
[root@server ~] # chkconfig –list | grep on                       # 列出所有启动的系统服务程序
[root@server ~] # rpm -qa                                                    # 查看所有安装的软件包
[root@server ~] # cat /proc/cpuinfo                                   # 查看CPU相关参数的linux系统命令
[root@server ~] # cat /proc/partitions                               # 查看linux硬盘和分区信息的系统信息命令
[root@server ~] # cat /proc/meminfo                                # 查看linux系统内存信息的linux系统命令
[root@server ~] # cat /proc/version                                   # 查看版本,类似uname -r
[root@server ~] # cat /proc/ioports                                    # 查看设备io端口
[root@server ~] # cat /proc/interrupts                               # 查看中断
[root@server ~] # cat /proc/pci                                            # 查看pci设备的信息
[root@server ~] # cat /proc/swaps                                      # 查看所有swap分区的信息

在vps上搭建nginx+twip

apache上搭建twip也试过,不过apache不愧是个吃资源的大户,于是准备改用nginx。网上搜了把发现还是很简单的,以下内容在原来的基础上略有修改。 1.安装需要的包

apt-get install curl libcurl3 libcurl3-dev

2.安装php组件

apt-get install php5-cli php5-cgi php5-curl spawn-fcgi

在最后添加:cgi.fix_pathinfo=1修改配置项:/etc/php5/cgi/php.ini 3.安装nginx组件

apt-get install nginx

4.启动php服务

1
2
killall -HUP php-cgi
spawn-fcgi -a 127.0.0.1 -p 9000 -C 10 -u www-data -f /usr/bin/php-cgi

5.配置nginx的配置文件,这里面需要注意下,有几个地方略作了修改。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
server {
    listen   443;
    server_name  twip.somename.com:443;
    root   /var/www;

    location / {
        if (!-e $request_filename) {
            rewrite ^/(.*)$ /index.php last;
        }
        index  index.php index.html index.htm;
    }

    location ~ \.php$ {
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  /var/www/$fastcgi_script_name;
        include    fastcgi_params;
    }

    location ~ /\.ht {
    deny  all;
    }
}

注意,因为我使用了加密连接,所以这里我监听的是443端口,server_name是你的域名root和fastcgi_param里的路径和你的api路径一致,我的是直接放在网站根目录下,如果你是放在yourdomain.com/twip下的话 可以改成/var/www/twip。 这段配置还有一个需要注意的地方就是要放在nginx.conf的http节点里面。由于我配置了ssl加密连接,所以还需要配置下相关证书。 在http节点里server节点外面加上配置好的证书路径即可。

ssl on;
ssl_certificate /etc/nginx/conf/ssl-unified.crt;
ssl_certificate_key /etc/nginx/conf/ssl.key;

关于证书的配置方法,因为我用的是startssl的免费证书,所以具体的方法可以看看他们的faq,非常简单。 最后就是部署twip了,这个也非常简单,到code.google.com上down下代码把config.php里的consume_key之类的填一下上传即可。 最后重启下nginx看看,/etc/init.d/nginx restart。   以上文章大部分参考的是在vps上搭建nginx+twip,在此借用希望不介意。

Linux禁用ping

禁止ping会有诸多不便,但是其带来的好处有时也令人不忍放弃,比如我,我有一台VPS之前因为搭了个VPN,结果没过多久后就遭到了洪水攻击,你懂得。。。后来把ping禁止掉后,换了下ssh的端口,立马清静了~

 

关于禁止ping的方法看了下网上很多人的帖子,其方式无外乎两类。一类通过修改内存加载的控制文件直接禁掉所有ICMP协议,另一类就是通过配置防火墙iptables规则来实现了。这两类方法各有优缺点,以下分别进行阐述。

 

第一类:修改内存加载的控制文件/proc/sys/net/ipv4/icmp_echo_ignore_all

这个方法也有很多种,最简单的就是直接修改文件:

关闭ping

echo 1 >/proc/sys/net/ipv4/icmp_echo_ignore_all

开启ping

echo 0 >/proc/sys/net/ipv4/icmp_echo_ignore_all

另外也可以通过控制命令sysctl来控制

sysctl -w net.ipv4.icmp_echo_ignore_all=1
sysctl -p

注:sysctl设置和显示在/proc/sys目录中的内核参数.能用sysctl来设置或重新设置连网功能,如IP转发、IP碎片去除及源路由检查等。用户只需要编辑/etc/sysctl.conf文件,即可手工或自动执行由sysctl控制的功能。

sysctl [-n] [-e] -w variable=value
sysctl [-n] [-e] -p (default /etc/sysctl.conf)
sysctl [-n] [-e] -a

常用参数的意义:
-w  临时改动某个指定参数的值,如:sysctl -w net.ipv4.ip_forward=1
-a   显示所有的系统参数
-p  从指定的文件加载系统参数,如不指定即从/etc/sysctl.conf中加载
如果仅仅是想临时改动某个系统参数的值,能用两种方法来实现,例如想启用IP路由转发功能:
1) #echo 1 > /proc/sys/net/ipv4/ip_forward
2) #sysctl -w net.ipv4.ip_forward=1
以上两种方法都可能即时开启路由功能,但如果系统重启,或执行了
# service network restart
命令,所设置的值即会丢失,如果想永久保留设置,能修改/etc/sysctl.conf文件
将 net.ipv4.ip_forward=0改为net.ipv4.ip_forward=1

可见,该方法的优点在于其简单,但缺点确在于无法保持配置,而且直接修改配置文件禁用的是整个icmp协议,在很多情况下确实有其不便之处。

第二类:配置iptables防火墙规则

本人对iptables也只是个初学者,没法进行详细讲解,这里就贴几个网上找到的例子。

iptables普通配置文件 :

vim /etc/firewall.sh

iptables -F
iptables -N FIREWALL
iptables -F FIREWALL
iptables -A INPUT -j FIREWALL
iptables -A FORWARD -j FIREWALL
iptables -A FIREWALL -p tcp -m tcp –dport 110 –syn -j ACCEPT
# nginx web server
iptables -A FIREWALL -p tcp -m tcp –dport 80 –syn -j ACCEPT
# apache web server
iptables -A FIREWALL -p tcp -m tcp –dport 81 –syn -j ACCEPT
#ssh
iptables -A FIREWALL -p tcp -m tcp –dport 22 –syn -j ACCEPT
iptables -A FIREWALL -i lo -j ACCEPT
# dns
iptables -A FIREWALL -p udp -m udp –sport 53 -j ACCEPT
iptables -A FIREWALL -p tcp -m tcp –syn -j REJECT
iptables -A FIREWALL -p udp -m udp -j REJECT
#禁ping
iptables -A INPUT -p icmp --icmp-type 8 -s 0/0 -j DROP
#开启ping
#iptables -D INPUT -p icmp --icmp-type 8 -s 0/0 -j DROP

生成firewall.sh文件

权限
chmod 755 /etc/firewall.sh

修改配置文件

vim /etc/init.d/rc.local

在最后一行加上
sh /etc/firewall.sh

iptables屏蔽IP :
#如果只是想屏蔽IP的话“3、开放指定的端口”可以直接跳过。
#屏蔽单个IP的命令是
iptables -I INPUT -s 123.45.6.7 -j DROP
#封整个段即从123.0.0.1到123.255.255.254的命令
iptables -I INPUT -s 123.0.0.0/8 -j DROP
#封IP段即从123.45.0.1到123.45.255.254的命令
iptables -I INPUT -s 124.45.0.0/16 -j DROP
#封IP段即从123.45.6.1到123.45.6.254的命令是
iptables -I INPUT -s 123.45.6.0/24 -j DROP

查看已配置的规则,使用如下命令

iptables -L

会输出以下内容

Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

上面的规则说明,允许任何人从任何地方访问。

首先来创建一个Iptables的文件

nano /etc/iptables.test.rules

输入以下规则

*filter

# Allows all loopback (lo0) traffic and drop all traffic to 127/8 that doesn’t use lo0
-A INPUT -i lo -j ACCEPT
-A INPUT ! -i lo -d 127.0.0.0/8 -j REJECT

# Accepts all established inbound connections
-A INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT

# Allows all outbound traffic
# You could modify this to only allow certain traffic
-A OUTPUT -j ACCEPT

# Allows HTTP and HTTPS connections from anywhere (the normal ports for websites)
-A INPUT -p tcp –dport 80 -j ACCEPT
-A INPUT -p tcp –dport 443 -j ACCEPT

# Allows SSH connections for script kiddies
# THE -dport NUMBER IS THE SAME ONE YOU SET UP IN THE SSHD_CONFIG FILE
-A INPUT -p tcp -m state –state NEW –dport 30000 -j ACCEPT

# Now you should read up on iptables rules and consider whether ssh access
# for everyone is really desired. Most likely you will only allow access from certain IPs.

# Allow ping
-A INPUT -p icmp -m icmp –icmp-type 8 -j ACCEPT

# log iptables denied calls (access via ‘dmesg’ command)
-A INPUT -m limit –limit 5/min -j LOG –log-prefix “iptables denied: ” –log-level 7

# Reject all other inbound – default deny unless explicitly allowed policy:
-A INPUT -j REJECT
-A FORWARD -j REJECT

这看到比较复杂,但细看每一部分,你会发现,它只是关闭除了我们允许的所有端口,在这种情况下是80和443端口(标准的网络浏览器的端口)和前面定义的SSH端口。

激活这些新的规则

iptables-restore < /etc/iptables.test.rules

再来看看有什么不同

iptables -L

我们看到,只有上面定义的端口是关闭的,其余都是关闭的。如果是这样的,将保存Iptables文件

iptables-save > /etc/iptables.up.rules

为了确保iptables规则开始重新启动,我们将创建一个新的文件

nano /etc/network/if-pre-up.d/iptables

输入下面内容

#!/bin/bash
/sbin/iptables-restore < /etc/iptables.up.rules

更改一下权限

chmod +x /etc/network/if-pre-up.d/iptables

#添加屏蔽IP
#禁止此IP访问服务器
iptables -I INPUT -s 1.2.3.4 -j DROP

iptables -A INPUT -s 1.2.3.4 -j DROP
#禁止服务器访问此IP
iptables -A OUTPUT -d 1.2.3.4 -j DROP
如果要封某个网段:
iptables -I INPUT -s 1.2.3.0/24 -j DROP

#清空屏蔽IP
iptables -t filter -D INPUT -s 1.2.3.4 -j DROP
iptables -t filter -D OUTPUT -d 1.2.3.4 -j DROP

#一键清空所有规则
iptables -F

#查看

iptables -L INPUT

iptables -L

iptables-save(此命令将保存规则,下次开机自动执行)

#处理IP碎片数量,防止攻击,允许每秒100个
iptables -A FORWARD -f -m limit –limit 100/s –limit-burst 100 -j ACCEPT
#设置ICMP包过滤,允许每秒1个包,限制触发条件是10个包
iptables -A FORWARD -p icmp -m limit –limit 1/s –limit-burst 10 -j ACCEPT

 

 

 

 

开启Apache的headers和expires模块

Header 和 Expries 是用来控制浏览器的缓存控制模块,通过开启该模块并进行一定的设置可以有效加速网站减少请求数和数据流量。

一般我们可以通过设置 HTTP 响应的 Head 中的 expired 和 cache-control 来控制页面在浏览器中的缓存 例如: Cache-Control: max-age=1800 Expires: Wed, 18 May 2012 21:00:00 GMT 缓存最大时长为1800秒,设定的过期时间为2012-05-18 21:00:00 Apache开启这两个模块非常简单(Debian环境) a2enmod headers a2enmod expries 开启后重启下apache即可。 如何充分利用这两个模块,关键在于配置。该配置可以配置到.htaccess文件下也可以在apache的网页控制文件下加入 我是直接在配置文件 /etc/apache2/sites-enabled/000-default文件里配置的

# ----------------------------------------------------------------------
# Expires headers (for better cache control)
# ----------------------------------------------------------------------

# these are pretty far-future expires headers
# they assume you control versioning with cachebusting query params like
#   <script src="application.js?20100608">
# additionally, consider that outdated proxies may miscache 
#   www.stevesouders.com/blog/2008/08/23/revving-filenames-dont-use-querystring/

# if you don't use filenames to version, lower the css and js to something like
#   "access plus 1 week" or so

<IfModule mod_expires.c>
  ExpiresActive on

# Perhaps better to whitelist expires rules? Perhaps.
  ExpiresDefault                          "access plus 1 month"

# cache.appcache needs re-requests in FF 3.6 (thx Remy ~Introducing HTML5)
  ExpiresByType text/cache-manifest       "access plus 0 seconds"

# your document html 
  ExpiresByType text/html                 "access plus 0 seconds"

# data
  ExpiresByType text/xml                  "access plus 0 seconds"
  ExpiresByType application/xml           "access plus 0 seconds"
  ExpiresByType application/json          "access plus 0 seconds"

# rss feed
  ExpiresByType application/rss+xml       "access plus 1 hour"

# favicon (cannot be renamed)
  ExpiresByType image/x-icon              "access plus 1 week" 

# media: images, video, audio
  ExpiresByType image/gif                 "access plus 1 month"
  ExpiresByType image/png                 "access plus 1 month"
  ExpiresByType image/jpg                 "access plus 1 month"
  ExpiresByType image/jpeg                "access plus 1 month"
  ExpiresByType video/ogg                 "access plus 1 month"
  ExpiresByType audio/ogg                 "access plus 1 month"
  ExpiresByType video/mp4                 "access plus 1 month"
  ExpiresByType video/webm                "access plus 1 month"

# htc files  (css3pie)
  ExpiresByType text/x-component          "access plus 1 month"

# webfonts
  ExpiresByType font/truetype             "access plus 1 month"
  ExpiresByType font/opentype             "access plus 1 month"
  ExpiresByType application/x-font-woff   "access plus 1 month"
  ExpiresByType image/svg+xml             "access plus 1 month"
  ExpiresByType application/vnd.ms-fontobject "access plus 1 month"

# css and javascript
  ExpiresByType text/css                  "access plus 1 year"
  ExpiresByType application/javascript    "access plus 1 year"
  ExpiresByType text/javascript           "access plus 1 year"

  <IfModule mod_headers.c>
    Header append Cache-Control "public"
  </IfModule>

</IfModule>

这是.htaccess下的一段配置代码,如果是在000-default文件下配置,则直接将中间的那段代码加入到
文件开头

<VirtualHost *:443> /*

ExpiresActive on
ExpiresDefault

*/ ServerAdmin webmaster@localhost ….. 关于expires的配置说明: ExpiresActive 指令:打开或关闭产生”Expires:”和”Cache-Control:”头的功能。 ExpiresByType 指令:指定MIME类型的文档(例如:text/html)的过期时间。 ExpiresDefault 指令:默认所有文档的过期时间。 过期时间的写法: “access plus 1 month” “access plus 4 weeks” “now plus 30 days” “modification plus 5 hours 3 minutes” A2592000 M604800 access、now及A 三种写法的意义相同,指过期时间从访问时开始计算。 modification及M 的意义相同,指过期时间是以被访问文件的最后修改时间开始计算。 所以,后一种写法只对静态文件起作用,而由脚本生成的动态页面不受它的作用。