想解决缓存的性能问题,准备选用BerkeleyDB作为存储方式,但会有单个文件的问题。
BerkeleyDB的性能没有问题的,DB库非常紧凑,不超过500K,但可以管理大至256T的数据量。
操作系统能够达到多少的单个文件的,对于ext3系统,是根据格式化时选择的blocksize来决定的:
参考:http://www.suse.de/~aj/linux_lfs.html
也就是说,ext3系统对应的单个文件限制为:
1k 16G
2k 256G
4k 2T
我们怎么知道现在的分区是多大的blocksize呢?
一般而言,格式化时会自动选择一个合适的文件大小的,硬盘大则会选4k,很小的则选择1k的。
在正常的硬盘(600G)上:
[root@aslibra ~]# dumpe2fs /dev/sda3
dumpe2fs 1.35 (28-Feb-2004)
Filesystem volume name: <none>
Last mounted on: <not available>
Filesystem UUID: 8b556c99-cbe6-48f2-bbfe-fea1969e2557
Filesystem magic number: 0xEF53
Filesystem revision #: 1 (dynamic)
Filesystem features: has_journal resize_inode filetype needs_recovery sparse_super large_file
Default mount options: (none)
Filesystem state: clean
Errors behavior: Continue
Filesystem OS type: Linux
Inode count: 87785472
Block count: 175546271
Reserved block count: 8777313
Free blocks: 37366602
Free inodes: 74134440
First block: 0
Block size: 4096
虚拟机上分配的硬盘(7G)比较小:
[root@aslibra /]# dumpe2fs /dev/sda1
....
Block size: 1024
也就是说,基本上单个文件可以用完整个硬盘,空间不用太担心。
有兴趣看更多的文件格式比较:
http://en.wikipedia.org/wiki/Comparison_of_file_systems
BerkeleyDB的性能没有问题的,DB库非常紧凑,不超过500K,但可以管理大至256T的数据量。
操作系统能够达到多少的单个文件的,对于ext3系统,是根据格式化时选择的blocksize来决定的:
引用
Filesystem File Size Limit Filesystem Size Limit
ext2/ext3 with 1 KiB blocksize 16448 MiB (~ 16 GiB) 2048 GiB (= 2 TiB)
ext2/3 with 2 KiB blocksize 256 GiB 8192 GiB (= 8 TiB)
ext2/3 with 4 KiB blocksize 2048 GiB (= 2 TiB) 8192 GiB (= 8 TiB)
ext2/3 with 8 KiB blocksize (Systems with 8 KiB pages like Alpha only) 65568 GiB (~ 64 TiB) 32768 GiB (= 32 TiB)
ext2/ext3 with 1 KiB blocksize 16448 MiB (~ 16 GiB) 2048 GiB (= 2 TiB)
ext2/3 with 2 KiB blocksize 256 GiB 8192 GiB (= 8 TiB)
ext2/3 with 4 KiB blocksize 2048 GiB (= 2 TiB) 8192 GiB (= 8 TiB)
ext2/3 with 8 KiB blocksize (Systems with 8 KiB pages like Alpha only) 65568 GiB (~ 64 TiB) 32768 GiB (= 32 TiB)
参考:http://www.suse.de/~aj/linux_lfs.html
也就是说,ext3系统对应的单个文件限制为:
1k 16G
2k 256G
4k 2T
我们怎么知道现在的分区是多大的blocksize呢?
一般而言,格式化时会自动选择一个合适的文件大小的,硬盘大则会选4k,很小的则选择1k的。
在正常的硬盘(600G)上:
[root@aslibra ~]# dumpe2fs /dev/sda3
dumpe2fs 1.35 (28-Feb-2004)
Filesystem volume name: <none>
Last mounted on: <not available>
Filesystem UUID: 8b556c99-cbe6-48f2-bbfe-fea1969e2557
Filesystem magic number: 0xEF53
Filesystem revision #: 1 (dynamic)
Filesystem features: has_journal resize_inode filetype needs_recovery sparse_super large_file
Default mount options: (none)
Filesystem state: clean
Errors behavior: Continue
Filesystem OS type: Linux
Inode count: 87785472
Block count: 175546271
Reserved block count: 8777313
Free blocks: 37366602
Free inodes: 74134440
First block: 0
Block size: 4096
虚拟机上分配的硬盘(7G)比较小:
[root@aslibra /]# dumpe2fs /dev/sda1
....
Block size: 1024
也就是说,基本上单个文件可以用完整个硬盘,空间不用太担心。
有兴趣看更多的文件格式比较:
http://en.wikipedia.org/wiki/Comparison_of_file_systems
linux的每个分区默认都有一个 lost+found 目录,是用来存放fsck过程中部分修复的文件的。
近日一块硬盘发生错误:
会提示硬盘有问题,估计硬盘快不行了咯 (⊙o⊙)
重启的时候还需要键盘按any key继续,这硬盘有问题啦,可怜的
在远程重启一直都没有启动好,原来真的是需要确认才能继续。。
在rw模式下操作,文件系统会在某个时候自动切换至read-only模式,不知道啥问题,出现IO错误多了就会这样?
umount后可以进行fsck:
如果没有umount,肯定是比较危险的事情,可能会导致现在被读取或者打开的文件都会丢到lost-found里面,到时候有你找的了,是不是这样我也不太肯定。
我胆敢尝试了一下在挂载为只读的时候fsck,发现lost-found里面的文件很多是samba共享的文件,不知道是否这个原因,但是要知道linux启动的时候也是挂载根分区为只读查盘的,而后在remount为rw。
翻开红帽系统管理的书找到依据,表明可以不umount而修复:
一个只读的挂载的文件系统可用fsck命令进行操作,并被修复。
近日一块硬盘发生错误:
引用
EXT3-fs error (device sdb1) in start_transaction: Journal has aborted
EXT3-fs error (device sdb1) in start_transaction: Journal has aborted
EXT3-fs error (device sdb1) in start_transaction: Journal has aborted
EXT3-fs error (device sdb1) in start_transaction: Journal has aborted
EXT3-fs error (device sdb1) in start_transaction: Journal has aborted
EXT3-fs error (device sdb1) in start_transaction: Journal has aborted
EXT3-fs error (device sdb1) in start_transaction: Journal has aborted
会提示硬盘有问题,估计硬盘快不行了咯 (⊙o⊙)
重启的时候还需要键盘按any key继续,这硬盘有问题啦,可怜的
在远程重启一直都没有启动好,原来真的是需要确认才能继续。。
在rw模式下操作,文件系统会在某个时候自动切换至read-only模式,不知道啥问题,出现IO错误多了就会这样?
umount后可以进行fsck:
如果没有umount,肯定是比较危险的事情,可能会导致现在被读取或者打开的文件都会丢到lost-found里面,到时候有你找的了,是不是这样我也不太肯定。
我胆敢尝试了一下在挂载为只读的时候fsck,发现lost-found里面的文件很多是samba共享的文件,不知道是否这个原因,但是要知道linux启动的时候也是挂载根分区为只读查盘的,而后在remount为rw。
翻开红帽系统管理的书找到依据,表明可以不umount而修复:
一个只读的挂载的文件系统可用fsck命令进行操作,并被修复。
今日群里问起一个问题:
echo 123|md5sum
ba1f2511fc30423bdbb183fe33f3dd0f -
php -r "echo md5('123');"
202cb962ac59075b964b07152d234b70
两者的md5值不一致,于是有很多有趣的解法:
1 Mysql解法:
2 修正换行符法
小结一下:
1 echo默认是带换行符做结尾的
2 echo -n 可以去掉换行符
3 printf是没有换行符结尾的
4 tr可以删掉一个字符,如 tr -d '\n'
5 php命令行执行一段程序是 php -r "code"
echo 123|md5sum
ba1f2511fc30423bdbb183fe33f3dd0f -
php -r "echo md5('123');"
202cb962ac59075b964b07152d234b70
两者的md5值不一致,于是有很多有趣的解法:
1 Mysql解法:
mysql> select md5('123');
+----------------------------------+
| md5('123') |
+----------------------------------+
| 202cb962ac59075b964b07152d234b70 |
+----------------------------------+
+----------------------------------+
| md5('123') |
+----------------------------------+
| 202cb962ac59075b964b07152d234b70 |
+----------------------------------+
2 修正换行符法
[root@fetion ~]# printf 123|md5sum
202cb962ac59075b964b07152d234b70 -
[root@fetion ~]# echo -n 123|md5sum
202cb962ac59075b964b07152d234b70 -
[root@fetion ~]# echo 123|tr -d '\n'|md5sum
202cb962ac59075b964b07152d234b70 -
202cb962ac59075b964b07152d234b70 -
[root@fetion ~]# echo -n 123|md5sum
202cb962ac59075b964b07152d234b70 -
[root@fetion ~]# echo 123|tr -d '\n'|md5sum
202cb962ac59075b964b07152d234b70 -
小结一下:
1 echo默认是带换行符做结尾的
2 echo -n 可以去掉换行符
3 printf是没有换行符结尾的
4 tr可以删掉一个字符,如 tr -d '\n'
5 php命令行执行一段程序是 php -r "code"
一台机器新上却没法登录,但在机房局域网机器却可以登录,登录后无法ping到外网网络。
有几样可能:
1 网线没接好?局域网可以访问所以不会这样
2 Mac地址冲突?局域网可以访问也说明不会
3 指定的IP无效?此IP曾经访问正常,只是不知道为啥突然不行了,机房确认此IP能有效进入
4 路由问题?估计是这样,因为数据包进入此机器,但返回阶段却可能找不到网关而导致通信失败
在局域网可以访问其实说明了通信基本可以正常,那估计是网关设置问题,检查路由表:
修改了IP的,但不妨碍说明问题。
路由表说明了什么样的IP使用哪个网卡,这个机器有两个网卡eth0和eth1
这个路由表很奇怪,默认应该发送到eth0的,网关也是用的eth0配置里的才对,不想居然有这样的情形,不知道是否机房安装系统的时候搞错了哪里了。
检查 eth0和eth1的配置,eth0里面有GATEWAY声明,但eth1里面没有GATEWAY声明,那怎么会出现这样的路由表呢?
删掉默认的那条,新添加一个:
这样就正常了,但重启后却恢复了之前的状态。
发现网络设置里面有这么一条网关声明:
原来问题出现在这里,删掉GATEWAY这一行恢复正常。
有几样可能:
1 网线没接好?局域网可以访问所以不会这样
2 Mac地址冲突?局域网可以访问也说明不会
3 指定的IP无效?此IP曾经访问正常,只是不知道为啥突然不行了,机房确认此IP能有效进入
4 路由问题?估计是这样,因为数据包进入此机器,但返回阶段却可能找不到网关而导致通信失败
在局域网可以访问其实说明了通信基本可以正常,那估计是网关设置问题,检查路由表:
[root@bogon ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
1.2.3.64 0.0.0.0 255.255.255.192 U 0 0 0 eth0
192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth1
0.0.0.0 192.168.1.1 0.0.0.0 UG 0 0 0 eth1
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
1.2.3.64 0.0.0.0 255.255.255.192 U 0 0 0 eth0
192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth1
0.0.0.0 192.168.1.1 0.0.0.0 UG 0 0 0 eth1
修改了IP的,但不妨碍说明问题。
路由表说明了什么样的IP使用哪个网卡,这个机器有两个网卡eth0和eth1
这个路由表很奇怪,默认应该发送到eth0的,网关也是用的eth0配置里的才对,不想居然有这样的情形,不知道是否机房安装系统的时候搞错了哪里了。
检查 eth0和eth1的配置,eth0里面有GATEWAY声明,但eth1里面没有GATEWAY声明,那怎么会出现这样的路由表呢?
删掉默认的那条,新添加一个:
route del default
route add default gw 1.2.3.65
route add default gw 1.2.3.65
这样就正常了,但重启后却恢复了之前的状态。
发现网络设置里面有这么一条网关声明:
[root@bogon ~]# cat /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=localhost.localdomain
GATEWAY=192.168.1.1
NETWORKING=yes
HOSTNAME=localhost.localdomain
GATEWAY=192.168.1.1
原来问题出现在这里,删掉GATEWAY这一行恢复正常。
网络监测会看的出有异常的访问,我们需要正常处理它,比如:

此流量是属于异常流量,如果有必要的话,可以处理它,在防火墙上加规则即可。
监测方面,cacti也是比较方便的,容易发现整体的问题,但知道网络出问题了,怎么检查呢?
iftop检查网络流量
iftop工具是一个很方便知道现在流量都对应哪些ip。
iftop: display bandwidth usage on an interface
下载文件解压后 ./configure && make && make install 即可
如果碰到相应的支持库没有的情况,比如:
那你需要先安装libpcap,找到相应的rpm文件,比如:
你可以从你的系统盘找到,ivh方式安装如果有问题就试试Uvh吧
如果已经有高版本的libpcap,那也许你可以试试强制安装你的版本:
yum方式安装其他类库
iftop使用很简单,会列出当前流量大小排序的响应,形式类似top命令,详情见官网介绍,你找到该ip即可加入防火墙规则。
iptables的使用
iptables就不多介绍了,用它来处理此问题再好不过了。
《LINUX SERVER HACKS》里的一篇文章:从任意服务器的命令行创建防火墙,介绍了基本的防火墙使用脚本:
里面有英文注释,我做了部分汉化(后面不太懂描述)和调整:
1 检查黑白名单是否存在
2 先处理黑名单
3 配置文件放/etc
默认防火墙规则应该是都开放的,所以我们仅仅封IP的话,就可以把相应的ip放在黑名单里面即可,一行一个
这个文件就简单解决了
另外,防火墙如果没启动,那就启动后再运行此脚本,可以保存此规则为默认规则
比如redhat里面是 service iptables save

此流量是属于异常流量,如果有必要的话,可以处理它,在防火墙上加规则即可。
监测方面,cacti也是比较方便的,容易发现整体的问题,但知道网络出问题了,怎么检查呢?
iftop检查网络流量
iftop工具是一个很方便知道现在流量都对应哪些ip。
iftop: display bandwidth usage on an interface
下载文件解压后 ./configure && make && make install 即可
如果碰到相应的支持库没有的情况,比如:
configure: error: can't find pcap.h
You're not going to get very far without libpcap.
You're not going to get very far without libpcap.
那你需要先安装libpcap,找到相应的rpm文件,比如:
引用
-rw-r--r-- 1 root root 108987 Apr 3 08:21 libpcap-0.9.4-8.1.i386.rpm
-rw-r--r-- 1 root root 119062 Apr 3 08:21 libpcap-devel-0.9.4-8.1.i386.rpm
-rw-r--r-- 1 root root 119062 Apr 3 08:21 libpcap-devel-0.9.4-8.1.i386.rpm
你可以从你的系统盘找到,ivh方式安装如果有问题就试试Uvh吧
如果已经有高版本的libpcap,那也许你可以试试强制安装你的版本:
rpm -Uvh --force libpcap-0.9.4-8.1.i386.rpm
rpm -Uvh --force libpcap-devel-0.9.4-8.1.i386.rpm
rpm -Uvh --force libpcap-devel-0.9.4-8.1.i386.rpm
yum方式安装其他类库
yum -y install tcpdump libpcap libpcap-devel ncurses ncurses-devel
iftop使用很简单,会列出当前流量大小排序的响应,形式类似top命令,详情见官网介绍,你找到该ip即可加入防火墙规则。
iptables的使用
iptables就不多介绍了,用它来处理此问题再好不过了。
《LINUX SERVER HACKS》里的一篇文章:从任意服务器的命令行创建防火墙,介绍了基本的防火墙使用脚本:
里面有英文注释,我做了部分汉化(后面不太懂描述)和调整:
1 检查黑白名单是否存在
2 先处理黑名单
3 配置文件放/etc
#!/bin/sh
WHITELIST=/etc/whitelist.txt
BLACKLIST=/etc/blacklist.txt
ALLOWED="22 25 80 88 8080 443"
# 清空规则
iptables -F
# 处理黑名单
if [ -f $BLACKLIST ] ;then
for x in `grep -v ^# $BLACKLIST | awk '{print $1}'`; do
echo "Blocking $x..."
iptables -A INPUT -t filter -s $x -j DROP
done
fi
# 处理白名单
if [ -f $WHITELIST ] ;then
for x in `grep -v ^# $WHITELIST | awk '{print $1}'`; do
echo "Permitting $x..."
iptables -A INPUT -t filter -s $x -j ACCEPT
done
fi
# 开发允许端口
for port in $ALLOWED; do
echo "Accepting port $port..."
iptables -A INPUT -t filter -p tcp --dport $port -j ACCEPT
done
#
# Finally, unless it's mentioned above, and it's an inbound startup request,
# just drop it.
#
iptables -A INPUT -t filter -p tcp --syn -j DROP
WHITELIST=/etc/whitelist.txt
BLACKLIST=/etc/blacklist.txt
ALLOWED="22 25 80 88 8080 443"
# 清空规则
iptables -F
# 处理黑名单
if [ -f $BLACKLIST ] ;then
for x in `grep -v ^# $BLACKLIST | awk '{print $1}'`; do
echo "Blocking $x..."
iptables -A INPUT -t filter -s $x -j DROP
done
fi
# 处理白名单
if [ -f $WHITELIST ] ;then
for x in `grep -v ^# $WHITELIST | awk '{print $1}'`; do
echo "Permitting $x..."
iptables -A INPUT -t filter -s $x -j ACCEPT
done
fi
# 开发允许端口
for port in $ALLOWED; do
echo "Accepting port $port..."
iptables -A INPUT -t filter -p tcp --dport $port -j ACCEPT
done
#
# Finally, unless it's mentioned above, and it's an inbound startup request,
# just drop it.
#
iptables -A INPUT -t filter -p tcp --syn -j DROP
默认防火墙规则应该是都开放的,所以我们仅仅封IP的话,就可以把相应的ip放在黑名单里面即可,一行一个
这个文件就简单解决了
另外,防火墙如果没启动,那就启动后再运行此脚本,可以保存此规则为默认规则
比如redhat里面是 service iptables save
LINUX
# uname -a
Linux DELL2950 2.6.5-7.244-smp #1 SMP Mon Dec 12 18:32:25 UTC 2005 i686 i686
后面是 X686或X86_64则内核是64位的,i686或i386则内核是32位的
AIX:
显示AIX系统内核是32位还是64位:
bootinfo -K
显示机器硬件是32位还是64位:
bootinfo -y
SUN:
$isainfo -bv
64表示内核是64位的,32表示内核是32位的
HPUX:
>getconf KERNEL_BITS
64表示内核是64位的,32表示内核是32位的
另外的方法:
getconf LONG_BIT
# uname -a
Linux DELL2950 2.6.5-7.244-smp #1 SMP Mon Dec 12 18:32:25 UTC 2005 i686 i686
后面是 X686或X86_64则内核是64位的,i686或i386则内核是32位的
AIX:
显示AIX系统内核是32位还是64位:
bootinfo -K
显示机器硬件是32位还是64位:
bootinfo -y
SUN:
$isainfo -bv
64表示内核是64位的,32表示内核是32位的
HPUX:
>getconf KERNEL_BITS
64表示内核是64位的,32表示内核是32位的
另外的方法:
getconf LONG_BIT
第一次接触到NIS服务是从《Redhat Enterprise Linux系统管理》上了解到的。
此服务是提供给局域网共用一些文件的,对于局域网管理来说,是个好东西。
大体是这样的意思:
主服务器共享用户数据、用户组数据、hosts设定等,其余服务器可以直接使用。
由此带来的好处是,你如果维护100台机器,那就不用独立维护这100台的用户数据了,可以使用一样的用户配置,然后hosts设定也可以在一台设定,其它都可以直接使用,这个也是一个很大的方便。
这里就不说具体的了,参考一下现成的资料即可配置:
鳥哥的 Linux 私房菜:《NIS 伺服器》
简体版:《简易 NIS Server 架设》
此服务是提供给局域网共用一些文件的,对于局域网管理来说,是个好东西。
大体是这样的意思:
主服务器共享用户数据、用户组数据、hosts设定等,其余服务器可以直接使用。
由此带来的好处是,你如果维护100台机器,那就不用独立维护这100台的用户数据了,可以使用一样的用户配置,然后hosts设定也可以在一台设定,其它都可以直接使用,这个也是一个很大的方便。
这里就不说具体的了,参考一下现成的资料即可配置:
鳥哥的 Linux 私房菜:《NIS 伺服器》
简体版:《简易 NIS Server 架设》






