Rootop 服务器运维与web架构

2011-05-24
发表者 Venus
暂无评论

linux 查看内存使用率 free -m 详解

今天top linux看了下内存占用率,看的有点儿迷糊,服务器压力不大,内存占用可不少,对此研究了一番。

Tasks: 131 total,   1 running, 130 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   4138480k total,  3368264k used,   770216k free,   156800k buffers
Swap: 10241428k total,        0k used, 10241428k free,  2783368k cached
我是4G的内存,使用了3个多G,很费解,接着free看看。

[root@emos ~]# free -m
total       used       free     shared    buffers     cached
Mem:                       4041       3288      752          0           153          2718
-/+ buffers/cache:                 417       3623
Swap:                       10001        0        10001

蓝色部分:

total 内存总数: 4041M;
used 已经使用的内存数: 3288M;
free  空闲的内存数: 752M
shared 不同进程间用来进行数据交换,一般都是0(多个进程共享的内存总额)
buffers 是由各种进程分配的,被用在如输入队列等方面,一个简单的例子如某个进程要求有多个字段读入,在所有字段被读入完整之前,进程把先前读入的字段放在buffer中保存。: 153M
cached 经常被用在磁盘的I/O请求上,如果有多个进程都要访问某个文件,于是该文件便被做成cache以方便下次被访问,这样可提供系统性能。:2718M

绿色部分:

(-buffers/cache) used内存数:417M (指的第一部分Mem行中的used – buffers – cached)
( buffers/cache) free内存数: 3623M (指的第一部分Mem行中的free buffers cached)

黄色部分:

交换分区,就不说了,自己也会明白。

我们可能会纳闷儿,蓝色部分(Mem)与绿色部分(-/+ buffers/cache)的结果中,有关used和free为什么这么奇怪?我们可以从二个方面来解释:
对操作系统来讲是Mem的参数buffers和cached 都是属于被使用,它认为free只有752M。
对应用程序来讲是(-/+ buffers/cach),buffers和cached 是等同可用的,buffer和cached是为了提高程序执行的性能,当程序使用内存时,buffer和cached会很快地被使用。

以应用来看看,以(-/+ buffers/cache)的free和used为主.我们看这个就好了.Linux为了提高磁盘和内存存取效率, 开发人员做了很多精心的设计, 除了对dentry进行缓存(用于VFS,加速文件路径名到inode的转换), 还采取了两种主要Cache方式:Buffer Cache和Page Cache.前者针对磁盘块的读写,后者针对文件inode的读写.这些Cache能有效缩短了 I/O系统调用(比如read,write,getdents)的时间.

内存是拿来用的,不是拿来看的。不像windows,无论你的真实物理内存有多少,他都要拿硬盘交换文件来读。这也就是windows为什么有时会提示虚拟空间不足的原因。在内存还有大部分的时候,拿出一部分硬盘空间来充当内存,硬盘怎么会快过内存?我们看linux,只要不用swap的交换空间,就不用担心自己的内存太少.如果常常swap用很多,可能你就要考虑加物理内存了,这也是linux看内存是否够用的标准。

那么有人说过段时间linux会自动释放掉所用的内存,我们使用free再来试试,看看是否有释放:

[root@emos ~]# free -m
total        used       free      shared    buffers     cached
Mem:                         4041       3288        752          0            153          2718
-/+ buffers/cache:                    417        3623
Swap:                        10001         0        10001

没有任何变化,那么我们就需要手动释放内存。

/proc是一个虚拟文件系统,我们可以通过对它的读写操作做为与kernel实体间进行通信的一种手段,也就是说可以通过修改/proc中的文件来对当前kernel的行为做出调整。我们可以通过调整/proc/sys/vm/drop_caches来释放内存:

[root@emos ~]# cat /proc/sys/vm/drop_caches   //默认为0
0
[root@emos ~]# sync   //sync 命令运行 sync 子例程。如果必须停止系统,则运行 sync 命令以确保文件系统的完整性。sync 命令将所有未写的系统缓冲区写到磁盘中,包含已修改的 i-node、已延迟的块 I/O 和读写映射文件)
[root@emos ~]# echo 3 > /proc/sys/vm/drop_caches
[root@emos ~]# free -m
total       used       free     shared    buffers     cached
Mem:          4041        381       3659          0          0         18    //cached被释放
-/+ buffers/cache:        362       3678
Swap:        10001          0      10001
[root@emos ~]# cat /proc/sys/vm/drop_caches     //再次查看内核参数变为3了。
3
有效的释放了buffer和cache

有关/proc/sys/vm/drop_caches的用法:

/proc/sys/vm/drop_caches (since Linux 2.6.16)

Writing  to  this  file  causes the kernel to drop clean caches,dentries and inodes from memory, causing that memory  to  becomefree.

To free pagecache,  use  echo 1 > /proc/sys/vm/drop_caches;
To free dentries and inodes, use echo 2 > /proc/sys/vm/drop_caches;
To free pagecache, dentries and inodes, use echo 3  >/proc/sys/vm/drop_caches.Because this is a non-destructive operation  and  dirty  objects

buffer 与cache 的区别
A buffer is something that has yet to be “written” to disk.
A cache is something that has been “read” from the disk and stored for later use.
更详细的解释参考:Difference Between Buffer and Cache
对于共享内存(Shared memory),主要用于在UNIX 环境下不同进程之间共享数据,是进程间通信的一种方法,一般的应用程序不会申请使用共享内存,如果你有兴趣,请参考:What is Shared Memory?
cache 和 buffer的区别:
Cache: 高速缓存,是位于CPU与主内存间的一种容量较小但速度很高的存储器。由于CPU的速度远高于主内存,CPU直接从内存中存取数据要等待一定时间周期,Cache中保存着CPU刚用过或循环使用的一部分数据,当CPU再次使用该部分数据时可从Cache中直接调用,这样就减少了CPU的等待时间,提高了系统的效率。Cache又分为一级Cache(L1 Cache)和二级Cache(L2 Cache),L1 Cache集成在CPU内部,L2 Cache早期一般是焊在主板上,现在也都集成在CPU内部,常见的容量有256KB或512KB L2 Cache。
Buffer:缓冲区,一个用于存储速度不同步的设备或优先级不同的设备之间传输数据的区域。通过缓冲区,可以使进程之间的相互等待变少,从而使从速度慢的设备读入数据时,速度快的设备的操作进程不发生间断。
Free中的buffer和cache:(它们都是占用内存):
buffer: 作为buffer cache的内存,是块设备的读写缓冲区
cache: 作为page cache的内存, 文件系统的cache
如果 cache 的值很大,说明cache住的文件数很多。如果频繁访问到的文件都能被cache住,那么磁盘的IO会非常小。
Buffer和Cache的区别
缓存(cached)是把读取过的数据保存起来,重新读取时若命中(找到需要的数据)就无需去读硬盘了,若没有命中就读硬盘。其中的数据会根据读取频率进行组织,把最频繁读取的内容放在最容易找到的位置,把不再读的内容不断往后排,直至从中删除。
缓冲(buffers)是根据磁盘的读写设计的,把分散的写操作集中进行,减少磁盘碎片和硬盘的反复寻道,从而提高系统性能。linux有一个守护进程定期清空缓冲内容(即写如磁盘),也可以通过sync命令手动清空缓冲。

2011-05-24
发表者 Venus
暂无评论

extmail 关闭天气信息

编辑: /extsuite/extmail/html/plugins/rpc_init.js  注释掉红色部分。(加个//就可以)
rpc_url_list = [
    //http://rpc-srv01.extmail.net/phprpc/rpc.php“,
    //http://rpc-srv02.extmail.net/phprpc/rpc.php“,
    //http://rpc-srv03.extmail.net/phprpc/rpc.php“,
];

rpc_plg_list = [
    //“coolweather”,
    //“etnews”,
    “chkupdate”,
];

2011-05-24
发表者 Venus
暂无评论

tcp_wrapper

      tcp_wrapper是linux中一个安全机制[TCP_wrappers防火墙],一定程度上限制某种服务的访问权限,达到了保护系统的目的.

我们会用到一个ldd命令,具体的man一下。 ( ldd – print shared library dependencies)
[root@rhel ~]# ldd /usr/sbin/sshd | grep wrap
        libwrap.so.0 => /lib64/libwrap.so.0 (0x00002ac3b2a5d000)
##ldd命令用来查看程序的二进制文件是否与libwrap相编连。

tcp_wraper工作机制是先读取/etc/hosts.allow这个文件看是否有匹配规则,如果允许,则通过,如果未发现相关匹配,再看/etc/hosts.deny这个文件是否拒绝。所以,我们一般编辑/etc/hosts.deny文件来做访问控制。如果allow和deny中都没有相关规则,那么执行默认,默认为允许。

配置文件的格式:

服务列表 :地址列表 :选项

服务列表 :
如果有多个服务,那么就用逗号隔开
地址列表格式:
1. 标准IP地址:例如:192.168.0.254,192.168.0.56如果多于一个用“逗号”隔开
2. 主机名称:例如:www.baidu.com, .example.con匹配整个域
3. 利用掩码:192.168.0.0/255.255.255.0 指定整个网段
4. 网络名称:例如 @mynetwork
选项:
主要有allow 和 deny 这两个选项

实例:

拒绝 172.17.1.19和172.17.1.20这两个IP拒绝访问服务器的sshd服务。

vi /etc/allow.deny

Add Code:

sshd:172.17.1.19,172.17.1.20

保存退出,tcp_wrapper无需重启服务即可生效。
下次登录的时候,就会提示:Connection refused 配置生效。tcp_wrapper可以临时性的拒绝某些IP访问,比如在受到ssh暴力破解登录的时候,或者是web服务器出现某个IP不断请求异常页面时,可以通过这个来做ACL。提高服务器的安全性。

2011-05-23
发表者 Venus
暂无评论

mysql 修改最大连接数

1、mysql修改最大连接数    

     mysql的最大连接数默认是100,可以通过命令:show variables; 查看

这个数值对于并发连接很多的数据库应用是远远不够的,当连接请求大于默认连接数后,就会出现无法连接数据库的错误,因此我们需要把它适当调大一些。修改my.cnf配置文件,在[mysqld]部分加入代码:

max_connections=1000   #我这里设置为1000,然后再次查看。

mysql> show variables like “%max_connections%”;
+—————–+——-+
| Variable_name   | Value |
+—————–+——-+
| max_connections | 1000  |
+—————–+——-+
1 row in set (0.00 sec)

2、查看当前mysql数据库已建立的连接数:

[root@rhel ~]# mysqladmin -uroot -proot status    #Threads就是当前连接数

Uptime: 1322  Threads: 2  Questions: 14  Slow queries: 0  Opens: 12  Flush tables: 1  Open tables: 6  Queries per second avg: 0.011

2011-05-21
发表者 Venus
隐藏系统版本及apache、nginx、php软件版本信息已关闭评论

隐藏系统版本及apache、nginx、php软件版本信息

1、隐藏服务器系统信息
当登陆到linux系统时,会显示该linux发行版的名称、版本、内核版本、服务器的名称。为了不让这些默认的信息显示出来,我们设置它只显示一个”login:”提示符。
删除/etc/issue和/etc/issue.net这两个文件。
本地登陆输入用户名和密码前显示的信息写在/etc/issue,当然,在这个文件你也可以写入其它的信息。


而/etc/issue.net是供telnet远端登入显示的信息,内容与/etc/issue是一样的。

issue文件中的参数

\d 本地端时间的日期;
\l 显示第几个终端机介面;
\m 显示硬体的等级 (i386/i486/i586/i686…);
\n 显示主机的网路名称;
\o 显示 domain name;
\r 作业系统的版本 (相当于 uname -r)
\t 显示本地端时间的时间;
\s 作业系统的名称;
\v 作业系统的版本。

登陆系统后的显示信息是保存在/etc/motd文件中,默认为空。

2、服务软件版本信息屏蔽

通过 curl 命令 查看服务器提供HTTP服务的相关信息,可以显示出服务器的HTTP是什么程序,哪个版本,如:
[root@r1 ~]# curl -I 192.168.0.103
HTTP/1.1 200 OK
Date: Sat, 21 May 2011 13:26:56 GMT
Server: Apache/2.2.3 (Red Hat)
X-Powered-By: PHP/5.1.6
Set-Cookie: PHPSESSID=uoe9ar9mc470njdlp1litrjr37; path=/
Connection: close
Content-Type: text/html; charset=utf-8

根据提示显示用了apache 2.2.3版本,系统是redhat,php版本为5.1.6。
隐藏apache版本信息:

编辑 httpd.conf:
ServerTokens ProductOnly   (默认为OS,显示操作系统信息)
ServerSignature Off                (一般在页面出现问题时,底部显示的信息)

比如404错误信息:

Not Found

The requested URL /a.html was not found on this server.

 


Apache/2.2.3 (Red Hat) Server at 192.168.0.103 Port 80

修改后再次测试:

[root@r1 conf]# curl -I 192.168.0.103
HTTP/1.1 200 OK
Date: Sat, 21 May 2011 13:51:30 GMT
Server: Apache    //web服务器版本号系统厂商隐藏
X-Powered-By: PHP/5.1.6
Set-Cookie: PHPSESSID=rs4q0jm73ph17llmppn99kb3k0; path=/
Connection: close
Content-Type: text/html; charset=utf-8

404错误页错误提示:

Not Found

The requested URL /a.html was not found on this server.

如果想隐藏橙色部分 Server: Apache,需要修改源代码,将ap_release.h文件中浅绿色部分修改:

#define AP_SERVER_BASEVENDOR “Apache Software Foundation”
#define AP_SERVER_BASEPROJECT “Apache HTTP Server”
#define AP_SERVER_BASEPRODUCT “VENUS”   

#define AP_SERVER_MAJORVERSION_NUMBER 2    //版本号
#define AP_SERVER_MINORVERSION_NUMBER 2
#define AP_SERVER_PATCHLEVEL_NUMBER   22
#define AP_SERVER_DEVBUILD_BOOLEAN    0

隐藏Nginx版本信息:

开启 nginx.conf,在http { }里加上:
server_tokens off;

隐藏php-fpm版本信息(未测):

编辑php-fpm配置文件:
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;
改为:
fastcgi_param SERVER_SOFTWARE nginx0.0.0; #(这个nginx0.0.0就是显示的内容)

隐藏PHP版本信息:

编辑php.ini :
expose_php = Off    //重新启动 Apache或者php-fpm即可。

测试:

[root@r1 conf]# curl -I 192.168.0.103
HTTP/1.1 200 OK
Date: Sat, 21 May 2011 13:54:15 GMT
Server: Apache
Set-Cookie: PHPSESSID=hgt5rq69ftu0sg1s0lg5tni620; path=/
Connection: close
Content-Type: text/html; charset=utf-8
我们看到X-Powered-By: PHP/5.1.6信息隐藏了。