logstash一个坑

回复

采菊篱下 发起了问题 • 1 人关注 • 0 个回复 • 1700 次浏览 • 2015-07-23 21:54 • 来自相关话题

探底df和du命令统计磁盘使用结果不一致

OpenSkill 发表了文章 • 2 个评论 • 1298 次浏览 • 2015-07-23 01:42 • 来自相关话题

现象:

      最近有一台主机,磁盘不断告警,提示磁盘空间使用大于95%,告警邮件如下图




      然后我就登陆服务器查看,然后df -h 和du -csh统计结果如下所示:[root@JAVA_HOST1 /]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/vda1 20G 18G 873M 96% /
tmpfs 1.9G 0 1.9G 0% /dev/shm
/dev/vdb 197G 105G 83G 57% /data[root@JAVA_HOST1 /]# du -csh ./*
6.6M ./bin
41M ./boot
4.0K ./boot_ucloud
105G ./data
156K ./dev
26M ./etc
4.0K ./home
130M ./lib
21M ./lib64
16K ./lost+found
4.0K ./media
4.0K ./mnt
24K ./opt
du: 无法访问"./proc/3741/task/3741/fd/4": 没有那个文件或目录
du: 无法访问"./proc/3741/task/3741/fdinfo/4": 没有那个文件或目录
du: 无法访问"./proc/3741/fd/4": 没有那个文件或目录
du: 无法访问"./proc/3741/fdinfo/4": 没有那个文件或目录
0 ./proc
168K ./root
16M ./sbin
4.0K ./selinux
4.0K ./srv
513M ./swapfile
0 ./sys
13M ./tmp
982M ./usr
378M ./var
107G 总用量      从du命令统计的结果可以看出,除掉/data分区的105G使用量,/分区的使用大小应该为2G,但是df查看却使用了18G,这明显不正常,那下面让我们来看看到底是为什么?

浅谈原理

du的工作原理
      du命令会对待统计文件逐个调用fstat这个系统调用,获取文件大小。它的数据是基于文件获取的,所以有很大的灵活性,不一定非要针对一个分区,可以跨越多个分区操作。如果针对的目录中文件很多,du速度就会很慢了。
 
df的工作原理
      df命令使用的事statfs这个系统调用,直接读取分区的超级块信息获取分区使用情况。它的数据是基于分区元数据的,所以只能针对整个分区。由于df直接读取超级块,所以运行速度不受文件多少影响,所以比较快速。

实验模拟说明

创建并删除文件
      创建文件前的磁盘容量情况:      # df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/sda1 12G 5.7G 5.5G 51% /
tmpfs 506M 0 506M 0% /dev/shm      创建文件:# dd if=/dev/zero of=test.iso bs=1024k count=1000
1000+0 records in
1000+0 records out
1048576000 bytes (1.0 GB) copied, 14.3055 seconds, 73.3 MB/s      现在的磁盘情况:文件系统 容量 已用 可用 已用% 挂载点
/dev/sda1 12G 6.7G 4.6G 60% /
tmpfs 506M 0 506M 0% /dev/shm      模拟某个进程正在使用该文件:# tail -f /tmp/test.iso      删除该文件
      打开另一个终端,登陆到系统中。查看是否有进程正在使用上面创建的文件:# lsof |grep test.iso
tail 2175 root 3r REG 8,1 1048576000 752972 /tmp/test.iso      把该文件删掉,并确认:# rm /tmp/test.iso
rm:是否删除 一般文件 “/tmp/test.iso”? y
# ls /tmp/test.iso
ls: /tmp/test.iso: 没有那个文件或目录      查看是否还有进程在使用(注意结尾的标记):# lsof |grep test.iso
tail 2175 root 3r REG 8,1 1048576000 752972 /tmp/test.iso (deleted)      查看磁盘使用情况:# df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/sda1 12G 6.7G 4.6G 60% /
tmpfs 506M 0 506M 0% /dev/shm
# cat /proc/diskstats |grep sda1
8 1 sda1 54385 5184 1626626 130090 20434 635997 5251448 5345733 0 111685 5475829      可见,虽然从ls 已经无法找到该文件,但因为tail 进程仍在使用该文件,故实际上内核并没有把这文件所占用的空间释放出来(df 结果和删除文件之前是一样的)。
 
停止tail进程:
      回到第一终端,用Ctrl+C 终止tail 进程,查看结果:# df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/sda1 12G 5.7G 5.5G 51% /
tmpfs 506M 0 506M 0% /dev/shm
# cat /proc/diskstats |grep sda1
8 1 sda1 54473 5184 1627402 130617 20453 636042 5251960 5345756 0 112226 5476379      至此,文件所占用的空间已完全释放。
实验结果:1、若有进程在占用某个文件,而其他进程把这文件删掉,只会删除其在磁盘中的标记,而不会释放其占用的磁盘空间;直到所有访问该文件的进程退出为止;
2、df 是从内核中获取磁盘占用情况数据的,而du是统计当前磁盘文件大小的结果,由于磁盘标记已被删掉,因此du 不会计算上述被删除文件的空间,导致df 与 du的结果不一致。

解决问题

1、把占用文件的相关进程关闭
      通过下面的命令得到这些已被删除,但未释放空间的文件和进程信息,然后删除  # lsof |grep deleted 找到这些进程后,在安全的情况下把其kill,空间自会马上释放。
# lsof |grep deleted |awk '{print $2}'|xargs -n1 -t kill -9
2、以清空的方式替代删除
      归根到底,产生问题的原因是,访问该文件的文件指针(句柄),在rm 动作后,因为进程仍在访问,因此,仍处在文件里面(中间或结尾处)。所以,如果用清空的方式,把文件指针重置,该文件所占用的空间也会马上释放出来。# echo > /tmp/test.iso
# df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/sda1 12G 5.7G 5.5G 51% /
tmpfs 506M 0 506M 0% /dev/shm
# tail -f /tmp/test.iso
tail: /tmp/test.iso: file truncated      所以,对于常发生类似问题的文件,如:日志记录文件等。以改名、清空、删除的顺序操作可避免该问题发生。

教育意义

code当出现du和df差距很大的情况时,考虑是否是有删除文件未完成造成的,方法是lsof命令,然后停止相关进程即可。
(2)可以使用清空文件的方式来代替删除文件,方式是:echo > test.iso。
(3)对于经常发生删除问题的日志文件,以改名、清空、删除的顺序操作。
(4)除了rm外,有些命令会间接的删除文件,如gzip命令完成后会删除原来的文件,为了避免删除问题,压缩前先确认没有进程打开该文件。[/code]

文件空洞

文件读写时,如果先文件指针偏移很大一段,然后写入1byte;这样这个文件实际占用1byte空间,但是stat查看文件大小,或者读写时,都会发现文件很大;所有没有写内容的都返回0,且不占用空间,这样的文件叫 'sparse file',即文件空洞
容易发生在一个进程在写一个文件,这是人工进行清空文件操作,就会产生。 查看全部


现象:


      最近有一台主机,磁盘不断告警,提示磁盘空间使用大于95%,告警邮件如下图
d1.png

      然后我就登陆服务器查看,然后df -h 和du -csh统计结果如下所示:
[root@JAVA_HOST1 /]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/vda1 20G 18G 873M 96% /
tmpfs 1.9G 0 1.9G 0% /dev/shm
/dev/vdb 197G 105G 83G 57% /data
[root@JAVA_HOST1 /]# du -csh ./*
6.6M ./bin
41M ./boot
4.0K ./boot_ucloud
105G ./data
156K ./dev
26M ./etc
4.0K ./home
130M ./lib
21M ./lib64
16K ./lost+found
4.0K ./media
4.0K ./mnt
24K ./opt
du: 无法访问"./proc/3741/task/3741/fd/4": 没有那个文件或目录
du: 无法访问"./proc/3741/task/3741/fdinfo/4": 没有那个文件或目录
du: 无法访问"./proc/3741/fd/4": 没有那个文件或目录
du: 无法访问"./proc/3741/fdinfo/4": 没有那个文件或目录
0 ./proc
168K ./root
16M ./sbin
4.0K ./selinux
4.0K ./srv
513M ./swapfile
0 ./sys
13M ./tmp
982M ./usr
378M ./var
107G 总用量
      从du命令统计的结果可以看出,除掉/data分区的105G使用量,/分区的使用大小应该为2G,但是df查看却使用了18G,这明显不正常,那下面让我们来看看到底是为什么?


浅谈原理


du的工作原理
      du命令会对待统计文件逐个调用fstat这个系统调用,获取文件大小。它的数据是基于文件获取的,所以有很大的灵活性,不一定非要针对一个分区,可以跨越多个分区操作。如果针对的目录中文件很多,du速度就会很慢了。
 
df的工作原理
      df命令使用的事statfs这个系统调用,直接读取分区的超级块信息获取分区使用情况。它的数据是基于分区元数据的,所以只能针对整个分区。由于df直接读取超级块,所以运行速度不受文件多少影响,所以比较快速。


实验模拟说明


创建并删除文件
      创建文件前的磁盘容量情况:      
# df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/sda1 12G 5.7G 5.5G 51% /
tmpfs 506M 0 506M 0% /dev/shm
      创建文件:
# dd if=/dev/zero of=test.iso bs=1024k count=1000
1000+0 records in
1000+0 records out
1048576000 bytes (1.0 GB) copied, 14.3055 seconds, 73.3 MB/s
      现在的磁盘情况:
文件系统                容量  已用   可用   已用%  挂载点
/dev/sda1 12G 6.7G 4.6G 60% /
tmpfs 506M 0 506M 0% /dev/shm
      模拟某个进程正在使用该文件:
# tail -f /tmp/test.iso
      删除该文件
      打开另一个终端,登陆到系统中。查看是否有进程正在使用上面创建的文件:
# lsof |grep test.iso
tail 2175 root 3r REG 8,1 1048576000 752972 /tmp/test.iso
      把该文件删掉,并确认:
# rm /tmp/test.iso
rm:是否删除 一般文件 “/tmp/test.iso”? y
# ls /tmp/test.iso
ls: /tmp/test.iso: 没有那个文件或目录
      查看是否还有进程在使用(注意结尾的标记):
# lsof |grep test.iso
tail 2175 root 3r REG 8,1 1048576000 752972 /tmp/test.iso (deleted)
      查看磁盘使用情况:
# df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/sda1 12G 6.7G 4.6G 60% /
tmpfs 506M 0 506M 0% /dev/shm
# cat /proc/diskstats |grep sda1
8 1 sda1 54385 5184 1626626 130090 20434 635997 5251448 5345733 0 111685 5475829
      可见,虽然从ls 已经无法找到该文件,但因为tail 进程仍在使用该文件,故实际上内核并没有把这文件所占用的空间释放出来(df 结果和删除文件之前是一样的)。
 
停止tail进程:
      回到第一终端,用Ctrl+C 终止tail 进程,查看结果:
# df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/sda1 12G 5.7G 5.5G 51% /
tmpfs 506M 0 506M 0% /dev/shm
# cat /proc/diskstats |grep sda1
8 1 sda1 54473 5184 1627402 130617 20453 636042 5251960 5345756 0 112226 5476379
      至此,文件所占用的空间已完全释放。
实验结果:
1、若有进程在占用某个文件,而其他进程把这文件删掉,只会删除其在磁盘中的标记,而不会释放其占用的磁盘空间;直到所有访问该文件的进程退出为止;
2、df 是从内核中获取磁盘占用情况数据的,而du是统计当前磁盘文件大小的结果,由于磁盘标记已被删掉,因此du 不会计算上述被删除文件的空间,导致df 与 du的结果不一致。


解决问题


1、把占用文件的相关进程关闭
      通过下面的命令得到这些已被删除,但未释放空间的文件和进程信息,然后删除  
# lsof |grep deleted 
找到这些进程后,在安全的情况下把其kill,空间自会马上释放。
# lsof |grep deleted |awk '{print $2}'|xargs -n1 -t kill -9

2、以清空的方式替代删除
      归根到底,产生问题的原因是,访问该文件的文件指针(句柄),在rm 动作后,因为进程仍在访问,因此,仍处在文件里面(中间或结尾处)。所以,如果用清空的方式,把文件指针重置,该文件所占用的空间也会马上释放出来。
# echo > /tmp/test.iso
# df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/sda1 12G 5.7G 5.5G 51% /
tmpfs 506M 0 506M 0% /dev/shm
# tail -f /tmp/test.iso
tail: /tmp/test.iso: file truncated
      所以,对于常发生类似问题的文件,如:日志记录文件等。以改名、清空、删除的顺序操作可避免该问题发生。


教育意义


code当出现du和df差距很大的情况时,考虑是否是有删除文件未完成造成的,方法是lsof命令,然后停止相关进程即可。
(2)可以使用清空文件的方式来代替删除文件,方式是:echo > test.iso。
(3)对于经常发生删除问题的日志文件,以改名、清空、删除的顺序操作。
(4)除了rm外,有些命令会间接的删除文件,如gzip命令完成后会删除原来的文件,为了避免删除问题,压缩前先确认没有进程打开该文件。[/code]


文件空洞


  文件读写时,如果先文件指针偏移很大一段,然后写入1byte;这样这个文件实际占用1byte空间,但是stat查看文件大小,或者读写时,都会发现文件很大;所有没有写内容的都返回0,且不占用空间,这样的文件叫 'sparse file',即文件空洞
容易发生在一个进程在写一个文件,这是人工进行清空文件操作,就会产生。


pip install greenlet 报错

OpenSkill 回复了问题 • 2 人关注 • 1 个回复 • 1507 次浏览 • 2015-07-21 15:52 • 来自相关话题

Centos安装pip和elasticsearch模块基本使用

OpenSkill 发表了文章 • 2 个评论 • 1119 次浏览 • 2015-07-20 23:21 • 来自相关话题

CentOS安装python包管理安装工具pip的方法如下:

# wget --no-check-certificate https://github.com/pypa/pip/archive/1.5.5.tar.gz
# mv 1.5.5 1.5.5.tar.gz
# tar zxf 1.5.5.tar.gz
# cd pip-1.5.5/
# python setup.py install
验证:
# pip -V
pip 1.5.5 from /usr/lib/python2.6/site-packages/pip-1.5.5-py2.6.egg (python 2.6)

安装elasticsearch模块如下:

# pip install elasticsearch

使用示例如下:

>>> from datetime import datetime
[quote]>> from elasticsearch import Elasticsearch[/quote]

# 默认情况下我们连接 localhost:9200
[quote]>> es = Elasticsearch()[/quote]

# datetimes 将序列化
[quote]>> es.index(index="my-index", doc_type="test-type", id=42, body={"any": "data", "timestamp": datetime.now()})
{u'_id': u'42', u'_index': u'my-index', u'_type': u'test-type', u'_version': 1, u'ok': True}[/quote]

# 但不是反序列化
[quote]>> es.get(index="my-index", doc_type="test-type", id=42)['_source']
{u'any': u'data', u'timestamp': u'2013-05-12T19:45:31.804229'}
[/quote] 查看全部


CentOS安装python包管理安装工具pip的方法如下:


# wget --no-check-certificate https://github.com/pypa/pip/archive/1.5.5.tar.gz
# mv 1.5.5 1.5.5.tar.gz
# tar zxf 1.5.5.tar.gz
# cd pip-1.5.5/
# python setup.py install
验证:
# pip -V
pip 1.5.5 from /usr/lib/python2.6/site-packages/pip-1.5.5-py2.6.egg (python 2.6)


安装elasticsearch模块如下:


# pip install elasticsearch


使用示例如下:


>>> from datetime import datetime
[quote]>> from elasticsearch import Elasticsearch[/quote]

# 默认情况下我们连接 localhost:9200
[quote]>> es = Elasticsearch()[/quote]

# datetimes 将序列化
[quote]>> es.index(index="my-index", doc_type="test-type", id=42, body={"any": "data", "timestamp": datetime.now()})
{u'_id': u'42', u'_index': u'my-index', u'_type': u'test-type', u'_version': 1, u'ok': True}[/quote]

# 但不是反序列化
[quote]>> es.get(index="my-index", doc_type="test-type", id=42)['_source']
{u'any': u'data', u'timestamp': u'2013-05-12T19:45:31.804229'}
[/quote]

/bin/bash^M: bad interpreter: No such file or directory

OpenSkill 发表了文章 • 0 个评论 • 672 次浏览 • 2015-07-15 20:35 • 来自相关话题

/bin/bash^M: bad interpreter: No such file or directory
出现上面错误的原因之一是脚本文件是DOS格式的, 即每一行的行尾以\r\n来标识, 使用vim编辑器打开脚本, 运行:
:set ff?
可以看到DOS或UNIX的字样. 使用set ff=unix把它强制为unix格式的, 然后存盘退出, 即可.

 
 
 
  查看全部
/bin/bash^M: bad interpreter: No such file or directory
出现上面错误的原因之一是脚本文件是DOS格式的, 即每一行的行尾以\r\n来标识, 使用vim编辑器打开脚本, 运行:
:set ff?
可以看到DOS或UNIX的字样. 使用set ff=unix把它强制为unix格式的, 然后存盘退出, 即可.

 
 
 
 

rsync 同步文件报错

采菊篱下 回复了问题 • 2 人关注 • 1 个回复 • 1502 次浏览 • 2015-07-10 16:00 • 来自相关话题

Linux系统安装后的基础优化-基于CentOS(5.8/6.4)

OpenSkill 发表了文章 • 0 个评论 • 889 次浏览 • 2015-07-04 21:58 • 来自相关话题

在51cto上面看到这篇基础优化文章非常好,情不自禁想转载分享给大家

在运维工作中,我们发现Linux系统安装之后并不能立即投入生产环境使用,往往需要先经过我们运维人员的优化才行。
下面我就为大家简单讲解几点关于Linux系统安装后的基础优化操作。

注意:本次优化都是基于CentOS(5.8/6.4)。关于5.8和6.4两者优化时的小区别,我会在文中提及的。
优化条目:
[]修改ip地址、网关、主机名、DNS等[/][]关闭selinux,清空iptables[/][]添加普通用户并进行sudo授权管理[/][]更新yum源及必要软件安装[/][]定时自动更新服务器时间[/][]精简开机自启动服务[/][]定时自动清理/var/spool/clientmqueue/目录垃圾文件,放置inode节点被占满[/][]变更默认的ssh服务端口,禁止root用户远程连接[/][]锁定关键文件系统[/][]调整文件描述符大小[/][]调整字符集,使其支持中文[/][]去除系统及内核版本登录前的屏幕显示[/][]内核参数优化[/]
1、修改ip地址、网关、主机名、DNS等
[root@localhost ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0 #网卡名字
BOOTPROTO=static #静态IP地址获取状态 如:DHCP表示自动获取IP地址
IPADDR=192.168.1.113 #IP地址
NETMASK=255.255.255.0 #子网掩码
ONBOOT=yes #引导时是否激活
GATEWAY=192.168.1.1
[root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=static
IPADDR=192.168.1.113
NETMASK=255.255.255.0
ONBOOT=yes
GATEWAY=192.168.1.1
[root@localhost ~]# vi /etc/sysconfig/network
HOSTNAME=c64 #修改主机名,重启生效
GATEWAY=192.168.1.1 #修改默认网关,如果上面eth0里面不配置网关的话,默认就使用这里的网关了。
[root@localhost ~]# cat /etc/sysconfig/network
HOSTNAME=c64
GATEWAY=192.168.1.1
我们也可以用 hostname c64 来临时修改主机名,重新登录生效
修改DNS
[root@localhost ~]# vi /etc/resolv.conf #修改DNS信息
nameserver 114.114.114.114
nameserver 8.8.8.8
[root@localhost ~]# cat /etc/resolv.conf #查看修改后的DNS信息
nameserver 114.114.114.114
nameserver 202.106.0.20
[root@localhost ~]# service network restart #重启网卡,生效
重启网卡,也可以用下面的命令
[root@localhost ~]# /etc/init.d/network restart2、关闭selinux,清空iptables
关闭selinux
[root@c64 ~]# sed –i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config #修改配置文件则永久生效,但是必须要重启系统。
[root@c64 ~]# grep SELINUX=disabled /etc/selinux/config
SELINUX=disabled #查看更改后的结果
[root@c64 ~]# setenforce 0 #临时生效命令
[root@c64 ~]# getenforce #查看selinux当前状态
Permissive清空iptables
[root@c64 ~]# iptables –F #清理防火墙规则
[root@c64 ~]# 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
[root@c64 ~]#/etc/init.d/iptables save #保存防火墙配置信息
[root@c64 ~]#service iptables off #开机不自动启动3、添加普通用户并进行sudo授权管理
[root@c64 ~]# useradd sunsky
[root@c64 ~]# echo "123456"|passwd --stdin sunsky && history –c
[root@c64 ~]# visudo
在root ALL=(ALL) ALL此行下,添加如下内容
sunsky ALL=(ALL) ALL4、更新yum源及必要软件安装
yum安装软件,默认获取rpm包的途径从国外官方源,改成国内的源。

国内较快的两个站点:搜狐镜像站点、网易镜像站点
法1:自己配置好安装源配置文件,然后上传到linux。

法2:使用镜像站点配置好的yum安装源配置文件
[root@c64 ~]# cd /etc/yum.repos.d/
[root@c64 yum.repos.d]# /bin/mv CentOS-Base.repo CentOS-Base.repo.bak
[root@c64 yum.repos.d]# wget http://mirrors.163.com/.help/CentOS6-Base-163.repo接下来执行如下命令,检测yum是否正常
[root@c64 yum.repos.d]# yum clean all #清空yum缓存
[root@c64 yum.repos.d]# yum makecache #建立yum缓存然后使用如下命令将系统更新到最新
[root@c64 yum.repos.d]# rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY* #导入签名KEY到RPM
[root@c64 yum.repos.d]# yum upgrade -y #更新系统内核到最新接下来就要安装几个必要的软件了
[root@c64 yum.repos.d]# yum install lrzsz ntpdate sysstat -y

lrzsz是一个上传下载的软件

ntpdate是用来与远程时间服务器进行时间更新的软件

sysstat是用来检测系统性能及效率的工具

5、定时自动更新服务器时间
[root@c64 ~]# echo '[i]/5 [/i] [i] [/i] * /usr/sbin/ntpdate time.windows.com >/dev/null 2 >&1' >>/var/spool/cron/root
[root@c64 ~]# echo '[i]/10 [/i] [i] [/i] * /usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1' >>/var/spool/cron/root

提示:CentOS 6.4的时间同步命令路径不一样
6是/usr/sbin/ntpdate
5是/sbin/ntpdate

扩展:在机器数量少时,以上定时任务同步时间就可以了。如果机器数量大时,可以在网内另外部署一台时间同步服务器NTP Server。此处仅提及,不做部署。

时间同步服务器架构图:




6、精简开机自启动服务
刚装完操作系统可以只保留crond,network,syslog,sshd这四个服务。(Centos6.4为rsyslog)
[root@c64 ~]# for sun in `chkconfig --list|grep 3:on|awk '{print $1}'`;do chkconfig --level 3 $sun off;done
[root@c64 ~]# for sun in crond rsyslog sshd network;do chkconfig --level 3 $sun on;done
[root@c64 ~]# chkconfig --list|grep 3:on
crond 0:off 1:off 2:on 3:on 4:on 5:on 6:off
network 0:off 1:off 2:on 3:on 4:on 5:on 6:off
rsyslog 0:off 1:off 2:on 3:on 4:on 5:on 6:off
sshd 0:off 1:off 2:on 3:on 4:on 5:on 6:off7、定时自动清理/var/spool/clientmqueue/目录垃圾文件,放置inode节点被占满
本优化点,在6.4上可以忽略不需要操作即可!
[root@c64 ~]# mkdir /server/scripts -p
[root@c64 ~]# vi /server/scripts/spool_clean.sh
#!/bin/sh
find /var/spool/clientmqueue/ -type f -mtime +30|xargs rm -f然后将其加入到crontab定时任务中
[root@c64 ~]# echo '[i]/30 [/i] [i] [/i] * /bin/sh /server/scripts/spool_clean.sh >/dev/null 2>&1' >>/var/spool/cron/root8、变更默认的ssh服务端口,禁止root用户远程连接
[root@c64 ~]# cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
[root@c64 ~]# vim /etc/ssh/sshd_config
Port 52113 #ssh连接默认的端口
PermitRootLogin no #root用户黑客都知道,禁止它远程登录
PermitEmptyPasswords no #禁止空密码登录
UseDNS no #不使用DNS
[root@c64 ~]# /etc/init.d/sshd reload #从新加载配置
[root@c64 ~]# netstat -lnt #查看端口信息
[root@c64 ~]# lsof -i tcp:52113
9、锁定关键文件系统
[root@c64 ~]# chattr +i /etc/passwd
[root@c64 ~]# chattr +i /etc/inittab
[root@c64 ~]# chattr +i /etc/group
[root@c64 ~]# chattr +i /etc/shadow
[root@c64 ~]# chattr +i /etc/gshadow使用chattr命令后,为了安全我们需要将其改名
[root@c64 ~]# /bin/mv /usr/bin/chattr /usr/bin/任意名称10、调整文件描述符大小
[root@localhost ~]# ulimit –n #查看文件描述符大小
1024
[root@localhost ~]# echo '* - nofile 65535' >> /etc/security/limits.conf配置完成后,重新登录即可查看。

提示:也可以把ulimit -SHn 65535命令加入到/etc/rc.local,然后每次重启生效
[root@c64 ~]# cat >>/etc/rc.local<<EOF
#open files
ulimit -HSn 65535
#stack size
ulimit -s 65535
EOF

扩展:文件描述符

文件描述符在形式上是一个非负整数。实际上,它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表。当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符。在程序设计中,一些涉及底层的程序编写往往会围绕着文件描述符展开。但是文件描述符这一概念往往只适用于Unix、Linux这样的操作系统。

习惯上,标准输入(standard input)的文件描述符是 0,标准输出(standard output)是 1,标准错误(standard error)是 2。尽管这种习惯并非Unix内核的特性,但是因为一些 shell 和很多应用程序都使用这种习惯,因此,如果内核不遵循这种习惯的话,很多应用程序将不能使用。

11、调整字符集,使其支持中文
sed -i 's#LANG="en_US.UTF-8"#LANG="zh_CN.GB18030"#' /etc/sysconfig/i18n
source /etc/sysconfig/i18n

扩展:什么是字符集?

简单的说就是一套文字符号及其编码。常用的字符集有:

GBK 定长双字节不是国际标准,支持系统不少

UTF-8 非定长 1-4字节广泛支持,MYSQL也使用UTF-8

12、去除系统及内核版本登录前的屏幕显示
[root@c64 ~]# >/etc/redhat-release
[root@c64 ~]# >/etc/issue13、内核参数优化
说明:本优化适合apache,nginx,squid多种等web应用,特殊的业务也可能需要略作调整。
[root@c64 ~]# vi /etc/sysctl.conf
#by sun in 20131001
net.ipv4.tcp_fin_timeout = 2
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_keepalive_time =600
net.ipv4.ip_local_port_range = 4000 65000
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.tcp_max_tw_buckets = 36000
net.ipv4.route.gc_timeout = 100
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_synack_retries = 1
net.core.somaxconn = 16384
net.core.netdev_max_backlog = 16384
net.ipv4.tcp_max_orphans = 16384
#一下参数是对iptables防火墙的优化,防火墙不开会有提示,可以忽略不理。
net.ipv4.ip_conntrack_max = 25000000
net.ipv4.netfilter.ip_conntrack_max = 25000000
net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 180
net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait = 120
net.ipv4.netfilter.ip_conntrack_tcp_timeout_close_wait = 60
net.ipv4.netfilter.ip_conntrack_tcp_timeout_fin_wait = 120
[root@localhost ~]# sysctl –p #使配置文件生效

提示:由于CentOS6.X系统中的模块名不是ip_conntrack,而是nf_conntrack,所以在/etc/sysctl.conf优化时,需要把net.ipv4.netfilter.ip_conntrack_max 这种老的参数,改成net.netfilter.nf_conntrack_max这样才可以。
即对防火墙的优化,在5.8上是

net.ipv4.ip_conntrack_max = 25000000
net.ipv4.netfilter.ip_conntrack_max = 25000000
net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 180
net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait = 120
net.ipv4.netfilter.ip_conntrack_tcp_timeout_close_wait = 60
net.ipv4.netfilter.ip_conntrack_tcp_timeout_fin_wait = 120在6.4上是
net.nf_conntrack_max = 25000000
net.netfilter.nf_conntrack_max = 25000000
net.netfilter.nf_conntrack_tcp_timeout_established = 180
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120
net.netfilter.nf_conntrack_tcp_timeout_close_wait = 60
net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 1201、5.8版本上
error: "net.ipv4.ip_conntrack_max" is an unknown key
error: "net.ipv4.netfilter.ip_conntrack_max" is an unknown key
error: "net.ipv4.netfilter.ip_conntrack_tcp_timeout_established" is an unknown key
error: "net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait" is an unknown key
error: "net.ipv4.netfilter.ip_conntrack_tcp_timeout_close_wait" is an unknown key
error: "net.ipv4.netfilter.ip_conntrack_tcp_timeout_fin_wait" is an unknown key这个错误可能是你的防火墙没有开启或者自动处理可载入的模块ip_conntrack没有自动载入,解决办法有二,一是开启防火墙,二是自动处理开载入的模块ip_conntrack
modprobe ip_conntrack
echo "modprobe ip_conntrack" >> /etc/rc.local2、6.4版本上
error: "net.nf_conntrack_max" is an unknown key
error: "net.netfilter.nf_conntrack_max" is an unknown key
error: "net.netfilter.nf_conntrack_tcp_timeout_established" is an unknown key
error: "net.netfilter.nf_conntrack_tcp_timeout_time_wait" is an unknown key
error: "net.netfilter.nf_conntrack_tcp_timeout_close_wait" is an unknown key
error: "net.netfilter.nf_conntrack_tcp_timeout_fin_wait" is an unknown key这个错误可能是你的防火墙没有开启或者自动处理可载入的模块ip_conntrack没有自动载入,解决办法有二,一是开启防火墙,二是自动处理开载入的模块ip_conntrack
modprobe nf_conntrack
echo "modprobe nf_conntrack" >> /etc/rc.local3、6.4版本上
error: "net.bridge.bridge-nf-call-ip6tables" is an unknown key
error: "net.bridge.bridge-nf-call-iptables" is an unknown key
error: "net.bridge.bridge-nf-call-arptables" is an unknown key这个错误是由于自动处理可载入的模块bridge没有自动载入,解决办法是自动处理开载入的模块ip_conntrack
modprobe bridge
echo "modprobe bridge" >> /etc/rc.local
文章转载 查看全部


在51cto上面看到这篇基础优化文章非常好,情不自禁想转载分享给大家


在运维工作中,我们发现Linux系统安装之后并不能立即投入生产环境使用,往往需要先经过我们运维人员的优化才行。
下面我就为大家简单讲解几点关于Linux系统安装后的基础优化操作。

注意:本次优化都是基于CentOS(5.8/6.4)。关于5.8和6.4两者优化时的小区别,我会在文中提及的。
优化条目:
    []修改ip地址、网关、主机名、DNS等[/][]关闭selinux,清空iptables[/][]添加普通用户并进行sudo授权管理[/][]更新yum源及必要软件安装[/][]定时自动更新服务器时间[/][]精简开机自启动服务[/][]定时自动清理/var/spool/clientmqueue/目录垃圾文件,放置inode节点被占满[/][]变更默认的ssh服务端口,禁止root用户远程连接[/][]锁定关键文件系统[/][]调整文件描述符大小[/][]调整字符集,使其支持中文[/][]去除系统及内核版本登录前的屏幕显示[/][]内核参数优化[/]

1、修改ip地址、网关、主机名、DNS等
[root@localhost ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0 #网卡名字
BOOTPROTO=static #静态IP地址获取状态 如:DHCP表示自动获取IP地址
IPADDR=192.168.1.113 #IP地址
NETMASK=255.255.255.0 #子网掩码
ONBOOT=yes #引导时是否激活
GATEWAY=192.168.1.1
[root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=static
IPADDR=192.168.1.113
NETMASK=255.255.255.0
ONBOOT=yes
GATEWAY=192.168.1.1
[root@localhost ~]# vi /etc/sysconfig/network
HOSTNAME=c64 #修改主机名,重启生效
GATEWAY=192.168.1.1 #修改默认网关,如果上面eth0里面不配置网关的话,默认就使用这里的网关了。
[root@localhost ~]# cat /etc/sysconfig/network
HOSTNAME=c64
GATEWAY=192.168.1.1
我们也可以用 hostname c64 来临时修改主机名,重新登录生效
修改DNS
[root@localhost ~]# vi /etc/resolv.conf #修改DNS信息
nameserver 114.114.114.114
nameserver 8.8.8.8
[root@localhost ~]# cat /etc/resolv.conf #查看修改后的DNS信息
nameserver 114.114.114.114
nameserver 202.106.0.20
[root@localhost ~]# service network restart #重启网卡,生效
重启网卡,也可以用下面的命令
[root@localhost ~]# /etc/init.d/network restart
2、关闭selinux,清空iptables
关闭selinux
[root@c64 ~]# sed –i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config     #修改配置文件则永久生效,但是必须要重启系统。
[root@c64 ~]# grep SELINUX=disabled /etc/selinux/config
SELINUX=disabled #查看更改后的结果
[root@c64 ~]# setenforce 0 #临时生效命令
[root@c64 ~]# getenforce #查看selinux当前状态
Permissive
清空iptables
[root@c64 ~]# iptables –F     #清理防火墙规则
[root@c64 ~]# 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
[root@c64 ~]#/etc/init.d/iptables save #保存防火墙配置信息
[root@c64 ~]#service iptables off #开机不自动启动
3、添加普通用户并进行sudo授权管理
[root@c64 ~]# useradd sunsky
[root@c64 ~]# echo "123456"|passwd --stdin sunsky && history –c
[root@c64 ~]# visudo
在root ALL=(ALL) ALL此行下,添加如下内容
sunsky ALL=(ALL) ALL
4、更新yum源及必要软件安装
yum安装软件,默认获取rpm包的途径从国外官方源,改成国内的源。

国内较快的两个站点:搜狐镜像站点网易镜像站点
法1:自己配置好安装源配置文件,然后上传到linux。

法2:使用镜像站点配置好的yum安装源配置文件
[root@c64 ~]# cd /etc/yum.repos.d/
[root@c64 yum.repos.d]# /bin/mv CentOS-Base.repo CentOS-Base.repo.bak
[root@c64 yum.repos.d]# wget http://mirrors.163.com/.help/CentOS6-Base-163.repo
接下来执行如下命令,检测yum是否正常
[root@c64 yum.repos.d]# yum clean all  #清空yum缓存
[root@c64 yum.repos.d]# yum makecache #建立yum缓存
然后使用如下命令将系统更新到最新
[root@c64 yum.repos.d]# rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY*       #导入签名KEY到RPM
[root@c64 yum.repos.d]# yum upgrade -y #更新系统内核到最新
接下来就要安装几个必要的软件了
[root@c64 yum.repos.d]# yum install lrzsz ntpdate sysstat -y


lrzsz是一个上传下载的软件

ntpdate是用来与远程时间服务器进行时间更新的软件

sysstat是用来检测系统性能及效率的工具


5、定时自动更新服务器时间
[root@c64 ~]# echo '[i]/5 [/i] [i] [/i] * /usr/sbin/ntpdate time.windows.com >/dev/null 2 >&1' >>/var/spool/cron/root
[root@c64 ~]# echo '[i]/10 [/i] [i] [/i] * /usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1' >>/var/spool/cron/root


提示:CentOS 6.4的时间同步命令路径不一样
6是/usr/sbin/ntpdate
5是/sbin/ntpdate


扩展:在机器数量少时,以上定时任务同步时间就可以了。如果机器数量大时,可以在网内另外部署一台时间同步服务器NTP Server。此处仅提及,不做部署。

时间同步服务器架构图:

t.png

6、精简开机自启动服务
刚装完操作系统可以只保留crond,network,syslog,sshd这四个服务。(Centos6.4为rsyslog)
[root@c64 ~]# for sun in `chkconfig --list|grep 3:on|awk '{print $1}'`;do chkconfig --level 3 $sun off;done
[root@c64 ~]# for sun in crond rsyslog sshd network;do chkconfig --level 3 $sun on;done
[root@c64 ~]# chkconfig --list|grep 3:on
crond 0:off 1:off 2:on 3:on 4:on 5:on 6:off
network 0:off 1:off 2:on 3:on 4:on 5:on 6:off
rsyslog 0:off 1:off 2:on 3:on 4:on 5:on 6:off
sshd 0:off 1:off 2:on 3:on 4:on 5:on 6:off
7、定时自动清理/var/spool/clientmqueue/目录垃圾文件,放置inode节点被占满
本优化点,在6.4上可以忽略不需要操作即可!
[root@c64 ~]# mkdir /server/scripts -p
[root@c64 ~]# vi /server/scripts/spool_clean.sh
#!/bin/sh
find /var/spool/clientmqueue/ -type f -mtime +30|xargs rm -f
然后将其加入到crontab定时任务中
[root@c64 ~]# echo '[i]/30 [/i] [i] [/i] * /bin/sh /server/scripts/spool_clean.sh >/dev/null 2>&1' >>/var/spool/cron/root
8、变更默认的ssh服务端口,禁止root用户远程连接
[root@c64 ~]# cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
[root@c64 ~]# vim /etc/ssh/sshd_config
Port 52113 #ssh连接默认的端口
PermitRootLogin no #root用户黑客都知道,禁止它远程登录
PermitEmptyPasswords no #禁止空密码登录
UseDNS no #不使用DNS
[root@c64 ~]# /etc/init.d/sshd reload #从新加载配置
[root@c64 ~]# netstat -lnt #查看端口信息
[root@c64 ~]# lsof -i tcp:52113

9、锁定关键文件系统
[root@c64 ~]# chattr +i /etc/passwd
[root@c64 ~]# chattr +i /etc/inittab
[root@c64 ~]# chattr +i /etc/group
[root@c64 ~]# chattr +i /etc/shadow
[root@c64 ~]# chattr +i /etc/gshadow
使用chattr命令后,为了安全我们需要将其改名
[root@c64 ~]# /bin/mv /usr/bin/chattr /usr/bin/任意名称
10、调整文件描述符大小
[root@localhost ~]# ulimit –n        #查看文件描述符大小
1024
[root@localhost ~]# echo '* - nofile 65535' >> /etc/security/limits.conf
配置完成后,重新登录即可查看。

提示:也可以把ulimit -SHn 65535命令加入到/etc/rc.local,然后每次重启生效
[root@c64 ~]# cat >>/etc/rc.local<<EOF
#open files
ulimit -HSn 65535
#stack size
ulimit -s 65535
EOF


扩展:文件描述符

文件描述符在形式上是一个非负整数。实际上,它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表。当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符。在程序设计中,一些涉及底层的程序编写往往会围绕着文件描述符展开。但是文件描述符这一概念往往只适用于Unix、Linux这样的操作系统。

习惯上,标准输入(standard input)的文件描述符是 0,标准输出(standard output)是 1,标准错误(standard error)是 2。尽管这种习惯并非Unix内核的特性,但是因为一些 shell 和很多应用程序都使用这种习惯,因此,如果内核不遵循这种习惯的话,很多应用程序将不能使用。


11、调整字符集,使其支持中文
sed -i 's#LANG="en_US.UTF-8"#LANG="zh_CN.GB18030"#' /etc/sysconfig/i18n
source /etc/sysconfig/i18n


扩展:什么是字符集?

简单的说就是一套文字符号及其编码。常用的字符集有:

GBK 定长双字节不是国际标准,支持系统不少

UTF-8 非定长 1-4字节广泛支持,MYSQL也使用UTF-8


12、去除系统及内核版本登录前的屏幕显示
[root@c64 ~]# >/etc/redhat-release
[root@c64 ~]# >/etc/issue
13、内核参数优化
说明:本优化适合apache,nginx,squid多种等web应用,特殊的业务也可能需要略作调整。
[root@c64 ~]# vi /etc/sysctl.conf
#by sun in 20131001
net.ipv4.tcp_fin_timeout = 2
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_keepalive_time =600
net.ipv4.ip_local_port_range = 4000 65000
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.tcp_max_tw_buckets = 36000
net.ipv4.route.gc_timeout = 100
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_synack_retries = 1
net.core.somaxconn = 16384
net.core.netdev_max_backlog = 16384
net.ipv4.tcp_max_orphans = 16384
#一下参数是对iptables防火墙的优化,防火墙不开会有提示,可以忽略不理。
net.ipv4.ip_conntrack_max = 25000000
net.ipv4.netfilter.ip_conntrack_max = 25000000
net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 180
net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait = 120
net.ipv4.netfilter.ip_conntrack_tcp_timeout_close_wait = 60
net.ipv4.netfilter.ip_conntrack_tcp_timeout_fin_wait = 120
[root@localhost ~]# sysctl –p #使配置文件生效


提示:由于CentOS6.X系统中的模块名不是ip_conntrack,而是nf_conntrack,所以在/etc/sysctl.conf优化时,需要把net.ipv4.netfilter.ip_conntrack_max 这种老的参数,改成net.netfilter.nf_conntrack_max这样才可以。
即对防火墙的优化,在5.8上是


net.ipv4.ip_conntrack_max = 25000000
net.ipv4.netfilter.ip_conntrack_max = 25000000
net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 180
net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait = 120
net.ipv4.netfilter.ip_conntrack_tcp_timeout_close_wait = 60
net.ipv4.netfilter.ip_conntrack_tcp_timeout_fin_wait = 120
在6.4上是
net.nf_conntrack_max = 25000000
net.netfilter.nf_conntrack_max = 25000000
net.netfilter.nf_conntrack_tcp_timeout_established = 180
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120
net.netfilter.nf_conntrack_tcp_timeout_close_wait = 60
net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120
1、5.8版本上
error: "net.ipv4.ip_conntrack_max" is an unknown key
error: "net.ipv4.netfilter.ip_conntrack_max" is an unknown key
error: "net.ipv4.netfilter.ip_conntrack_tcp_timeout_established" is an unknown key
error: "net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait" is an unknown key
error: "net.ipv4.netfilter.ip_conntrack_tcp_timeout_close_wait" is an unknown key
error: "net.ipv4.netfilter.ip_conntrack_tcp_timeout_fin_wait" is an unknown key
这个错误可能是你的防火墙没有开启或者自动处理可载入的模块ip_conntrack没有自动载入,解决办法有二,一是开启防火墙,二是自动处理开载入的模块ip_conntrack
modprobe ip_conntrack
echo "modprobe ip_conntrack" >> /etc/rc.local
2、6.4版本上
error: "net.nf_conntrack_max" is an unknown key
error: "net.netfilter.nf_conntrack_max" is an unknown key
error: "net.netfilter.nf_conntrack_tcp_timeout_established" is an unknown key
error: "net.netfilter.nf_conntrack_tcp_timeout_time_wait" is an unknown key
error: "net.netfilter.nf_conntrack_tcp_timeout_close_wait" is an unknown key
error: "net.netfilter.nf_conntrack_tcp_timeout_fin_wait" is an unknown key
这个错误可能是你的防火墙没有开启或者自动处理可载入的模块ip_conntrack没有自动载入,解决办法有二,一是开启防火墙,二是自动处理开载入的模块ip_conntrack
modprobe nf_conntrack
echo "modprobe nf_conntrack" >> /etc/rc.local
3、6.4版本上
error: "net.bridge.bridge-nf-call-ip6tables" is an unknown key
error: "net.bridge.bridge-nf-call-iptables" is an unknown key
error: "net.bridge.bridge-nf-call-arptables" is an unknown key
这个错误是由于自动处理可载入的模块bridge没有自动载入,解决办法是自动处理开载入的模块ip_conntrack
modprobe bridge
echo "modprobe bridge" >> /etc/rc.local

文章转载

Haproxy配置文件详解

回复

OpenSkill 发起了问题 • 1 人关注 • 0 个回复 • 2077 次浏览 • 2015-07-04 17:48 • 来自相关话题

nginx: [emerg] unknown directive “ssl” in

采菊篱下 回复了问题 • 2 人关注 • 1 个回复 • 3076 次浏览 • 2015-07-04 17:25 • 来自相关话题

Fatal error: Call to a member function setAttribute() on null in

采菊篱下 回复了问题 • 2 人关注 • 1 个回复 • 1871 次浏览 • 2015-07-04 16:58 • 来自相关话题