Linux清空内存和磁盘缓存

细心的朋友会注意到,当你在linux下频繁存取文件后,物理内存会很快被用光,当程序结束后,内存不会被正常释放,而是一直作为caching.这个问题,貌似有不少人在问,不过都没有看到有什么很好解决的办法.那么我来谈谈这个问题.

先来说说free命令

[root@server ~]# free -m
total       used       free     shared    buffers     cached
Mem:           249        163         86          0         10         94
-/+ buffers/cache:         58        191
Swap:          511          0        511

其中:

total 内存总数

used 已经使用的内存数

free 空闲的内存数

shared 多个进程共享的内存总额

buffers Buffer Cache和cached Page Cache 磁盘缓存的大小

-buffers/cache 的内存数:used – buffers – cached

+buffers/cache 的内存数:free + buffers + cached

可用的memory=free memory+buffers+cached

有了这个基础后,可以得知,我现在used为163MB,free为86,buffer和cached分别为10,94

那么我们来看看,如果我执行复制文件,内存会发生什么变化.

[root@server ~]# cp -r /etc ~/test/
[root@server ~]# free -m
total       used       free     shared    buffers     cached
Mem:           249        244          4          0          8        174
-/+ buffers/cache:         62        187
Swap:          511          0        511

在我命令执行结束后,used为244MB,free为4MB,buffers为8MB,cached为174MB,天呐都被cached吃掉了.别紧张,这是为了提高文件读取效率的做法.

引用http://www.wujianrong.com/archives/2007/09/linux_free.html” 为了提高磁盘存取效率, Linux做了一些精心的设计, 除了对dentry进行缓存(用于VFS,加速文件路径名到inode的转换), 还采取了两种主要Cache方式:Buffer Cache和Page Cache。前者针对磁盘块的读写,后者针对文件inode的读写。这些Cache有效缩短了 I/O系统调用(比如read,write,getdents)的时间。”

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

[root@server test]# free -m
total       used       free     shared    buffers     cached
Mem:           249        244          5          0          8        174
-/+ buffers/cache:         61        188
Swap:          511          0        511

MS没有任何变化,那么我能否手动释放掉这些内存呢???回答是可以的!

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

[root@server test]# cat /proc/sys/vm/drop_caches
0
首先,/proc/sys/vm/drop_caches的值,默认为0

[root@server test]# sync

手动执行sync命令(描述:sync 命令运行 sync 子例程。如果必须停止系统,则运行 sync 命令以确保文件系统的完整性。sync 命令将所有未写的系统缓冲区写到磁盘中,包含已修改的 i-node、已延迟的块 I/O 和读写映射文件)

[root@server test]# echo 3 > /proc/sys/vm/drop_caches
[root@server test]# cat /proc/sys/vm/drop_caches
3

将/proc/sys/vm/drop_caches值设为3

[root@server test]# free -m
total       used       free     shared    buffers     cached
Mem:           249         66        182          0          0         11
-/+ buffers/cache:         55        194
Swap:          511          0        511

再来运行free命令,发现现在的used为66MB,free为182MB,buffers为0MB,cached为11MB.那么有效的释放了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  become
free.

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
are not freeable, the user should run sync(8) first.

=======================================================

测试程序性能的时候,之前的时候需要不停的重启机器来进行测试,比较麻烦,想有什么办法可以清空磁盘缓存呢?

If you’re on OS X, the ‘purge’ command (part of the CHUD developer tools) will cause the disk caches to be purged. On Linux, with a 2.6.16 kernel or newer, ‘echo 3 > /proc/sys/vm/drop_caches’ will achieve the same effect. Another trick on Linux is to use a separate filesystem for the benchmark–if you perform a umount/mount cycle
after each run the kernel will drop any cached data that came from that filesystem.

两种方法:
echo 3 > /proc/sys/vm/drop_caches
umount /dev/sdx

参考:
http://www.gamedev.net/community/forums/topic.asp?topic_id=402069
http://blog.chinaunix.net/u/27173/showart_467689.html

Linux下的Memcached安装

最近在研究怎么让Discuz!去应用Memcache去做一些事情,记录下Memcache安装的过程。

Linux下Memcache服务器端的安装
服务器端主要是安装memcache服务器端,目前的最新版本是 memcached-1.3.0 。
下载:http://www.danga.com/memcached/dist/memcached-1.2.2.tar.gz
另外,Memcache用到了libevent这个库用于Socket的处理,所以还需要安装libevent,libevent的最新版本是libevent-1.3。(如果你的系统已经安装了libevent,可以不用安装)
官网:http://www.monkey.org/~provos/libevent/
下载:http://www.monkey.org/~provos/libevent-1.3.tar.gz

用wget指令直接下载这两个东西.下载回源文件后。
1.先安装libevent。这个东西在配置时需要指定一个安装路径,即./configure –prefix=/usr;然后make;然后make install;
2.再安装memcached,只是需要在配置时需要指定libevent的安装路径即./configure –with-libevent=/usr;然后make;然后make install;
这样就完成了Linux下Memcache服务器端的安装。详细的方法如下:

1.分别把memcached和libevent下载回来,放到 /tmp 目录下:
# cd /tmp
# wget http://www.danga.com/memcached/dist/memcached-1.2.0.tar.gz
# wget http://www.monkey.org/~provos/libevent-1.2.tar.gz

2.先安装libevent:
# tar zxvf libevent-1.2.tar.gz
# cd libevent-1.2
# ./configure –prefix=/usr
# make
# make install

3.测试libevent是否安装成功:
# ls -al /usr/lib | grep libevent
lrwxrwxrwx 1 root root 21 11?? 12 17:38 libevent-1.2.so.1 -> libevent-1.2.so.1.0.3
-rwxr-xr-x 1 root root 263546 11?? 12 17:38 libevent-1.2.so.1.0.3
-rw-r–r– 1 root root 454156 11?? 12 17:38 libevent.a
-rwxr-xr-x 1 root root 811 11?? 12 17:38 libevent.la
lrwxrwxrwx 1 root root 21 11?? 12 17:38 libevent.so -> libevent-1.2.so.1.0.3
还不错,都安装上了。

4.安装memcached,同时需要安装中指定libevent的安装位置:
# cd /tmp
# tar zxvf memcached-1.2.0.tar.gz
# cd memcached-1.2.0
# ./configure –with-libevent=/usr
# make
# make install
如果中间出现报错,请仔细检查错误信息,按照错误信息来配置或者增加相应的库或者路径。
安装完成后会把memcached放到 /usr/local/bin/memcached ,

5.测试是否成功安装memcached:
# ls -al /usr/local/bin/mem*
-rwxr-xr-x 1 root root 137986 11?? 12 17:39 /usr/local/bin/memcached
-rwxr-xr-x 1 root root 140179 11?? 12 17:39 /usr/local/bin/memcached-debug

安装Memcache的PHP扩展
1.在http://pecl.php.net/package/memcache 选择相应想要下载的memcache版本。
2.安装PHP的memcache扩展

#tar vxzf memcache-2.2.1.tgz
#cd memcache-2.2.1
#/usr/local/php/bin/phpize
#./configure –enable-memcache –with-php-config=/usr/local/php/bin/php-config –with-zlib-dir
#make
#make install

3.上述安装完后会有类似这样的提示:

Installing shared extensions: /usr/local/php/lib/php/extensions/no-debug-non-zts-2007xxxx/

4.把php.ini中的extension_dir = “./”修改为

extension_dir = “/usr/local/php/lib/php/extensions/no-debug-non-zts-2007xxxx/”

5.添加一行来载入memcache扩展:extension=memcache.so

memcached的基本设置:
1.启动Memcache的服务器端:
# /usr/local/bin/memcached -d -m 10 -u root -l 192.168.0.200 -p 12000 -c 256 -P /tmp/memcached.pid

-d选项是启动一个守护进程,
-m是分配给Memcache使用的内存数量,单位是MB,我这里是10MB,
-u是运行Memcache的用户,我这里是root,
-l是监听的服务器IP地址,如果有多个地址的话,我这里指定了服务器的IP地址192.168.0.200,
-p是设置Memcache监听的端口,我这里设置了12000,最好是1024以上的端口,
-c选项是最大运行的并发连接数,默认是1024,我这里设置了256,按照你服务器的负载量来设定,
-P是设置保存Memcache的pid文件,我这里是保存在 /tmp/memcached.pid,

2.如果要结束Memcache进程,执行:

# kill `cat /tmp/memcached.pid`

也可以启动多个守护进程,不过端口不能重复。

3.重启apache,service httpd restart

Memcache环境测试:
运行下面的php文件,如果有输出This is a test!,就表示环境搭建成功。开始领略Memcache的魅力把!
< ?php
$mem = new Memcache;
$mem->connect(”127.0.0.1″, 11211);
$mem->set(’key’, ‘This is a test!’, 0, 60);
$val = $mem->get(’key’);
echo $val;
?>

参考资料:
对Memcached有疑问的朋友可以参考下列文章:
Linux下的Memcache安装:http://www.ccvita.com/257.html
Windows下的Memcache安装:http://www.ccvita.com/258.html
Memcache基础教程:http://www.ccvita.com/259.html
Discuz!的Memcache缓存实现:http://www.ccvita.com/261.html
Memcache协议中文版:http://www.ccvita.com/306.html

linux下top命令参数解释

    top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器。下面详细介绍它的使用方法。

top – 01:06:48 up 1:22, 1 user, load average: 0.06, 0.60, 0.48
Tasks: 29 total,   1 running, 28 sleeping,   0 stopped,   0 zombie
Cpu(s): 0.3% us, 1.0% sy, 0.0% ni, 98.7% id, 0.0% wa, 0.0% hi, 0.0% si
Mem:    191272k total,   173656k used,    17616k free,    22052k buffers
Swap:   192772k total,        0k used,   192772k free,   123988k cached

PID USER      PR NI VIRT RES SHR S %CPU %MEM    TIME+ COMMAND
1379 root      16   0 7976 2456 1980 S 0.7 1.3   0:11.03 sshd
14704 root       16   0 2128 980 796 R 0.7 0.5   0:02.72 top
1 root      16   0 1992 632 544 S 0.0 0.3   0:00.90 init
2 root      34 19     0    0    0 S 0.0 0.0   0:00.00 ksoftirqd/0
3 root      RT   0     0    0    0 S 0.0 0.0   0:00.00 watchdog/0

统计信息区
———————————————————
前五行是系统整体的统计信息。
第一行是任务队列信息,同uptime命令的执行结果。其内容如下:
01:06:48                       当前时间
up 1:22                        系统运行时间,格式为时:分
1 user                         当前登录用户数
load average: 0.06, 0.60, 0.48 系统负载,即任务队列的平均长度。三个数值分别为1分钟、5分钟、15分钟前到现在的平均值。

第二、三行为进程和CPU的信息。
当有多个CPU时,这些内容可能会超过两行。内容如下:
Tasks: 29 total     进程总数
1 running           正在运行的进程数
28 sleeping         睡眠的进程数
0 stopped           停止的进程数
0 zombie            僵尸进程数
Cpu(s): 0.3% us     用户空间占用CPU百分比
1.0% sy             内核空间占用CPU百分比
0.0% ni             用户进程空间内改变过优先级的进程占用CPU百分比
98.7% id            空闲CPU百分比
0.0% wa             等待输入输出的CPU时间百分比
0.0% hi
0.0% si
0.0%st

最后两行为内存信息。内容如下:
Mem: 191272k total      物理内存总量
173656k used            使用的物理内存总量
17616k free             空闲内存总量
22052k buffers          用作内核缓存的内存量

Swap: 192772k total     交换区总量
0k used                 使用的交换区总量
192772k free            空闲交换区总量
123988k cached          缓冲的交换区总量
内存中的内容被换出到交换区,而后又被换入到内存,但使用过的交换区尚未被覆盖,该数值即为这些内容已存在于内存中的交换区的大小。相应的内存再次被换出时可不必再对交换区写入。

进程信息区
统计信息区域的下方显示了各个进程的详细信息。首先来认识一下各列的含义。
列名     含义
a         PID      进程id
b         PPID     父进程id
c         RUSER    Real user name
d         UID      进程所有者的用户id
e         USER     进程所有者的用户名
f         GROUP    进程所有者的组名
g         TTY      启动进程的终端名。不是从终端启动的进程则显示为 ?
h         PR       优先级
i         NI       nice值。负值表示高优先级,正值表示低优先级
j         P        最后使用的CPU,仅在多CPU环境下有意义
k         %CPU     上次更新到现在的CPU时间占用百分比
l         TIME     进程使用的CPU时间总计,单位秒
m         TIME+    进程使用的CPU时间总计,单位1/100秒
n         %MEM     进程使用的物理内存百分比
o         VIRT     进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
p         SWAP     进程使用的虚拟内存中,被换出的大小,单位kb。
q         RES      进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
r         CODE     可执行代码占用的物理内存大小,单位kb
s         DATA     可执行代码以外的部分(数据段+栈)占用的物理内存大小,单位kb
t         SHR      共享内存大小,单位kb
u         nFLT     页面错误次数
v         nDRT     最后一次写入到现在,被修改过的页面数。
w         S        进程状态。
D=不可中断的睡眠状态
R=运行
S=睡眠
T=跟踪/停止
Z=僵尸进程
x     COMMAND      命令名/命令行
y     WCHAN        若该进程在睡眠,则显示睡眠中的系统函数名
z     Flags        任务标志,参考 sched.h

默认情况下仅显示比较重要的 PID、USER、PR、NI、VIRT、RES、SHR、S、%CPU、%MEM、TIME+、COMMAND 列。可以通过下面的快捷键来更改显示内容。

更改显示内容
通过f键可以选择显示的内容。按f键之后会显示列的列表,按a-z即可显示或隐藏对应的列,最后按回车键确定。
按o键可以改变列的显示顺序。按小写的a- 可以将相应的列向右移动,而大写的A-Z可以将相应的列向左移动。最后按回车键确定。
按大写的F或O键,然后按a-z可以将进程按照相应的列进行排序。而大写的R键可以将当前的排序倒转。

top的使用
———————————————————
显示系统当前的进程和其他状况;top是一个动态显示过程,即可以通过用户按键来不断刷新当前状态.如果在前台执行该命令,它将独占前台,直到用户终止该 程序为止. 比较准确的说,top命令提供了实时的对系统处理器的状态监视.它将显示系统中CPU最“敏感”的任务列表.该命令可以按CPU使用.内存使用和执行时间 对任务进行排序;而且该命令的很多特性都可以通过交互式命令或者在个人定制文件中进行设定.

top [-] [d] [p] [q] [c] [C] [S] [s] [n]
d 指定每两次屏幕信息刷新之间的时间间隔。当然用户可以使用s交互命令来改变之。
p 通过指定监控进程ID来仅仅监控某个进程的状态。
q 该选项将使top没有任何延迟的进行刷新。如果调用程序有超级用户权限,那么top将以尽可能高的优先级运行。
S 指定累计模式
s 使top命令在安全模式中运行。这将去除交互命令所带来的潜在危险。
i 使top不显示任何闲置或者僵死进程。
c 显示整个命令行而不只是显示命令名

下面介绍在top命令执行过程中可以使用的一些交互命令。从使用角度来看,熟练的掌握这些命令比掌握选项还重要一些。这些命令都是单字母的,如果在命令行选项中使用了s选项,则可能其中一些命令会被屏蔽掉。
Ctrl+L 擦除并且重写屏幕。
h/? 显示帮助画面,给出一些简短的命令总结说明。
k   终止一个进程。系统将提示用户输入需要终止的进程PID,以及需要发送给该进程什么样的信号。一般的终止进程可以使用15信号;如果不能正常结束那就使用 信号9强制结束该进程。默认值是信号15。在安全模式中此命令被屏蔽。
i   忽略闲置和僵死进程。这是一个开关式命令。
q   退出程序。
r   重新安排一个进程的优先级别。系统提示用户输入需要改变的进程PID以及需要设置的进程优先级值。输入一个正值将使优先级降低,反之则可以使该进程拥有更高的优先权。默认值是10。
S   切换到累计模式。
s   改变两次刷新之间的延迟时间。系统将提示用户输入新的时间,单位为s。如果有小数,就换算成m s。输入0值则系统将不断刷新,默认值是5 s。需要注意的是如果设置太小的时间,很可能会引起不断刷新,从而根本来不及看清显示的情况,而且系统负载也会大大增加。
    f/F 从当前显示中添加或者删除项目。
    o/O 改变显示项目的顺序。
    l   切换显示平均负载和启动时间信息。
    m   切换显示内存信息。
    t   切换显示进程和CPU状态信息。
    c   切换显示命令名称和完整命令行。
    M   根据驻留内存大小进行排序。
    P   根据CPU使用百分比大小进行排序。
    T   根据时间/累计时间进行排序。
W   将当前设置写入~/.toprc文件中。这是写top配置文件的推荐方法。

Windows平台下使用XAMPP之Sendmail功能設定方法

Window本身沒有”sendmail”的功能,如果想用跟Unix-like中一樣Sendmail的功能,
XAMPP可以使用Fake-sendmail來替代,這必須準備一組SMTP來作為Sendmail發信用。

設定的方法如下:

1.修改 x:\xampp\sendmail\sendmail.ini 檔案,修改以下資料:

smtp_server=smtp.gmail.com
[email protected]
auth_password=abcde

2.修改 x:\xampp\apache\bin\php.ini 檔案,修改以下資料:

[mail function]
; For Win32 only.
;SMTP = localhost
;smtp_port = 25

; For Win32 only.
;sendmail_from = [email protected]

; For Unix only.  You may supply arguments as well (default: "sendmail -t -i").
sendmail_path = "E:\xampp\sendmail\sendmail.exe -t"
< ?php
$now = date("Y-m-d h:i:s");
$from_name = '測試寄件者';
$from_email = '[email protected]';
$headers = 'From: $from_name ';
$body = '嗨, \n 這是一封測試信件來自 $from_name < $from_email>.';
$subject = '[$now] 測試信件發送';
$to = '[email protected]';
if (mail($to, $subject, $body, $headers)) {
    echo "success!";
} else {
    echo "fail…";
}
?>

oracle 11g for linux(centos 5.2) 安装

一、检查硬件需求

1、检查内存空间大小

[root@tech_002 ~]# grep MemTotal /proc/meminfo
MemTotal: 3041772 kB


2、查看交换分区swap

[root@tech_002 home]# grep SwapTotal 

/proc/meminfo SwapTotal: 2031608 kB


3、假如交换分区空间不够,可以增加

创建/home/swap这么一个分区文件。文件的大小是5120000个block,一般情况下1个block为1K,所以这里空间是5G。

dd if=/dev/zero of=/home/swap bs=1024 count=5120000 
5120000+0 records in
5120000+0 records out
5242880000 bytes (5.2 GB) copied, 39.3974 seconds, 133 MB/s 


接着再把这个分区变成swap分区。
 

[root@tech_002 home]# /sbin/mkswap /home/swap 

Setting up swapspace version 1, size = 5242875 kB


然后把它加到fstab里面

[root@tech_002 home]# echo “/home/swap swap swap defaults 0 0” >> /etc/fstab ; cat /etc/fstab 

/dev/VolGroup00/LogVol00 / ext3 defaults 1 1
LABEL=/boot /boot ext3 defaults 1 2
tmpfs /dev/shm tmpfs defaults 0 0
devpts /dev/pts devpts gid=5,mode=620 0 0
sysfs /sys sysfs defaults 0 0
proc /proc proc defaults 0 0
/dev/VolGroup00/LogVol01 swap swap defaults 0 0
/home/swap swap swap defaults 0 0


4、oracle 11g 所必须的安装包

[root@tech_002 ~]# rpm -q binutils compat-libstdc++-33 elfutils-libelf elfutils-libelf-devel glibc glibc-common glibc-devel gcc- gcc-c++ libaio-devel libaio libgcc libstdc++ libstdc++-devel make sysstat unixODBC unixODBC-devel 
binutils-2.17.50.0.6-6.el5
compat-libstdc++-33-3.2.3-61
compat-libstdc++-33-3.2.3-61
elfutils-libelf-0.125-3.el5
elfutils-libelf-0.125-3.el5
elfutils-libelf-devel-0.125-3.el5
glibc-2.5-24
glibc-2.5-24
glibc-common-2.5-24
glibc-devel-2.5-24
glibc-devel-2.5-24
gcc-4.1.2-42.el5
gcc-c++-4.1.2-42.el5
libaio-devel-0.3.106-3.2
libaio-devel-0.3.106-3.2
libaio-0.3.106-3.2
libaio-0.3.106-3.2
libgcc-4.1.2-42.el5
libgcc-4.1.2-42.el5
libstdc++-4.1.2-42.el5
libstdc++-4.1.2-42.el5
libstdc++-devel-4.1.2-42.el5
make-3.81-3.el5
sysstat-7.0.2-1.el5
unixODBC-2.2.11-7.1
unixODBC-2.2.11-7.1
unixODBC-devel-2.2.11-7.1
unixODBC-devel-2.2.11-7.1


5、配置内核参数


cat >> /etc/sysctl.conf <<EOF 
kernel.shmall = 2097152
kernel.shmmax = 2147483648
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
fs.file-max = 65536
net.ipv4.ip_local_port_range = 1024 65000
net.core.rmem_default = 4194304
net.core.rmem_max=4194304
net.core.wmem_default = 262144
net.core.wmem_max = 262144
EOF


然后执行



[root@tech_002 etc]# /sbin/sysctl -p 
net.ipv4.ip_forward = 0
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
kernel.shmall = 2097152
kernel.shmmax = 2147483648
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
fs.file-max = 65536
net.ipv4.ip_local_port_range = 1024 65000
net.core.rmem_default = 4194304
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 262144


6、给系统添加oracle用户

groupadd oinstall
groupadd dba
useradd -g oinstall -G dba oracle
passwd oracle


7、添加参数

cat >> /etc/security/limits.conf <<EOF 
oracle soft nproc 2047
oracle hard nproc 16384
oracle soft nofile 1024
oracle hard nofile 65536
EOF


cat >> /etc/pam.d/login <<EOF 
session required /lib/security/pam_limits.so
session required pam_limits.so
EOF




cat >> /etc/profile <<EOF
if [ $USER = “oracle” ]; then
if [ $SHELL = “/bin/ksh” ]; then
ulimit -p 16384
ulimit -n 65536
else
ulimit -u 16384 -n 65536
fi
fi
EOF


8、创建目录

mkdir -p /oracle_11/app/ 
chown -R oracle:oinstall /oracle_11/app/
chmod -R 755 /oracle_11/app/
sudo mkdir /oracle_11/tmp
sudo chmod a+wr /oracle_11/tmp


9、修改用户的shell

more /home/oracle/.bash_profile 
# .bash_profile
umask 022
TMP=/oracle_11/tmp
TMPDIR=/oracle_11/tmp
export TMP TMPDIR
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
# User specific environment and startup programs
PATH=$PATH:$HOME/bin
export PATH
export ORACLE_BASE=/oracle_11/app/oracle
export ORACLE_HOME=$ORACLE_BASE/product/11.1.0/db_1
export ORA_CRS_HOME=$ORACLE_BASE/crs
export ORACLE_PATH=$ORACLE_BASE/common/oracle/sql:.:$ORACLE_HOME/rdbms/admin
export ORACLE_SID=orcl
export PATH=$ORACLE_HOME/bin:$ORA_CRS_HOME/bin:${PATH}:$HOME/bin
export PATH=${PATH}:/usr/bin:/bin:/usr/bin/X11:/usr/local/bin
export PATH=${PATH}:$ORACLE_BASE/common/oracle/bin
export ORACLE_TERM=xterm
export TNS_ADMIN=$ORACLE_HOME/network/admin
export ORA_NLS10=$ORACLE_HOME/nls/data
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/lib:/usr/lib:/usr/local/lib:$ORACLE_HOME/oracm/lib:$ORACLE_HOME/lib
export LIBPATH=$LIBPATH:$ORA_CRS_HOME/lib:$ORACLE_HOME/lib
export CLASSPATH=${CLASSPATH}:$ORACLE_HOME/rdbms/jlib:$ORACLE_HOME/jlib:$ORACLE_HOME/network/jlib:$ORACLE_HOME/JRE
export NLS_LANG=AMERICAN_AMERICA.ZHS16G


10、用Xstart连接centos的图形界面
查看更多精彩图片

解压数据库文件,安装数据库

#unzip linux.x64_11gR1_database.zip
#su – oracle
$export DISPLAY=192.168.93.202:0.0
$./runInstaller  

netfilter conntrack调优(iptables使用)

原文http://www.wallfire.org/misc/netfilter_conntrack_perf.txt
中文版http://www.linuxmine.com/5791.html
大意如下
有两点我们要注意.
-conntrack最大数量.叫做conntrack_max
-存储这些conntrack的hash表的大小,叫做hashsize

当conntrack入口数大于conntrack_max时,在hash表中每一个conntrack list中的存储的入口将不可控.(conntrack_mark/hashsize 为每个list所能存储的入口的数量)

hash表存在于固定的的不可swap的内存中. conntrack_mark决定占用多少这些不可swap的内存.

缺省的hashsize
——————————–
conntrack_max=hashsize*8
i386中 hashsize=conntrack_max/8=ramsize(in bytes)/131072=ramsize(in MegaBytes)*8.
所以32位pc,512M内存可以存512*1024^2/128/1024=512*8=4096(连接池list)

但是正确的算法是:
hashsize=conntrack_max/8=ramsize(in bytes)/131072/(x/32)
x表示使用的指针类型是(32位还是64的)

—————————-\
读取conntrack_max值
cat /proc/sys/net/ipv4/ip_conntrack_max

读取hashsize值
cat /proc/sys/net/ipv4/netfilter/ip_conntrack_buckets

——————————
你可修改这两个值以适应高负载的netfilter的应用
系统默认为conntrack_max:hashsize是8:1,你可以设成1:1以提高性能.

————————-
设置conntrack_max
echo $CONNTRACK_MAX > /proc/sys/net/ipv4/ip_conntrack_max

设置hashsize
如果(netfilter conntrack静态编译在内核中),2.4中可以在编译时设置,2.6可以在启动中(boot时)加入ip_conntrack.hashsize=$hashsize
如果为modules,则可以使用 modprobe ip_conntrack hashsize=$hashsize

————————–
conntrack使用的内存计算
size_of_mem_used_by_conntrack (in bytes) =
CONNTRACK_MAX * sizeof(struct ip_conntrack) +
HASHSIZE * sizeof(struct list_head)
其中sizeof(struct ip_conntrack)大概在192-352字节之间.
sizeof(struct list_head) = 2 * size_of_a_pointer(i386中为4字节)

一个例子512m内存,使用384m来用于conntrack则
384*1024*1024/(352+8)(使用它是保守计算) =~1143901 (此为conntrack:hashszie为1:1,352为sizeof(ip_conntrack),8为sizeof(list_head).
由于hash最好设为2的乘方的数,所以为1048576(2^20).

———————

附相关设置及命令:
ip_conntrack timeout 原值432000秒(5天)
可改为10小时,echo “600” > /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_established

ip_conntrack buffer使用情况
grep conn /proc/slabinfo
例ip_conntrack 188069 229570 336 11 1 : tunables 54 27 8 : slabdata 20870

相关修改:
echo “1024 65000” > /proc/sys/net/ipv4/ip_local_port_range
echo “100 1200 128 512 15 5000 500 1884 2”>/proc/sys/vm/bdflush
echo “1” > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
echo “1” > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses
echo “1048576” > /proc/sys/net/ipv4/netfilter/ip_conntrack_max
echo “1” > /proc/sys/net/ipv4/ip_forward
echo “268435456” >/proc/sys/kernel/shmall
echo “536870912” >/proc/sys/kernel/shmmax
echo “600” > /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_established
echo “1024” > /proc/sys/net/ipv4/neigh/default/gc_thresh1
echo “2048” > /proc/sys/net/ipv4/neigh/default/gc_thresh2
echo “4096” > /proc/sys/net/ipv4/neigh/default/gc_thresh3
echo “52428800” > /proc/sys/net/ipv4/route/max_size
echo “1” > /proc/sys/net/ipv4/conf/all/proxy_arp
echo “1” > /proc/sys/net/ipv4/tcp_window_scaling

如果系统日志出现下面信息:
Nov 19 22:18:10 Server kernel: printk: 3 messages suppressed.
Nov 19 22:26:50 Server kernel: printk: 10 messages suppressed.
Nov 19 23:41:25 Server kernel: printk: 3 messages suppressed.
Nov 19 23:41:31 Server kernel: printk: 14 messages suppressed.
Nov 19 23:41:36 Server kernel: printk: 11 messages suppressed.
Nov 19 23:41:40 Server kernel: printk: 7 messages suppressed.
Nov 19 23:41:45 Server kernel: printk: 8 messages suppressed.
Nov 19 23:41:51 Server kernel: printk: 9 messages suppressed.
Nov 19 23:41:55 Server kernel: printk: 3 messages suppressed.
Nov 19 23:42:01 Server kernel: printk: 4 messages suppressed.
Nov 19 23:42:11 Server kernel: printk: 2 messages suppressed.
Nov 19 23:42:20 Server kernel: printk: 2 messages suppressed.
Nov 19 23:42:28 Server kernel: printk: 1 messages suppressed.
Nov 20 02:06:48 Server last message repeated 6 times
Nov 20 02:12:50 Server kernel: printk: 8 messages suppressed.
Nov 20 02:13:12 Server kernel: printk: 2 messages suppressed.
Nov 20 02:13:23 Server kernel: printk: 2 messages suppressed.
Nov 20 02:13:30 Server kernel: printk: 1 messages suppressed.
Nov 20 02:13:40 Server kernel: printk: 1 messages suppressed.
Nov 20 02:24:04 Server kernel: printk: 14 messages suppressed.
Nov 20 02:24:09 Server kernel: printk: 24 messages suppressed.
Nov 20 02:24:14 Server kernel: printk: 24 messages suppressed.
Nov 20 02:24:19 Server kernel: printk: 23 messages suppressed.
Nov 20 02:24:24 Server kernel: printk: 24 messages suppressed.
Nov 20 02:24:29 Server kernel: printk: 24 messages suppressed.
Nov 20 02:24:34 Server kernel: printk: 20 messages suppressed.
Nov 20 02:24:39 Server kernel: printk: 24 messages suppressed.
Nov 20 02:24:44 Server kernel: printk: 23 messages suppressed.
Nov 20 02:24:49 Server kernel: printk: 24 messages suppressed.
Nov 20 02:31:53 Server kernel: printk: 23 messages suppressed.
Nov 20 08:54:55 Server sshd(pam_unix)[4593]: session opened for user root by root(uid=0)
修改:
/proc/sys/net/ipv4/neigh/default/gc_thresh1
/proc/sys/net/ipv4/neigh/default/gc_thresh2
/proc/sys/net/ipv4/neigh/default/gc_thresh3
的值

CPU0: Temperature above threshold, cpu clock throttled Machine check events logged

CPU0: Temperature above threshold, cpu clock throttled
Machine check events logged
CPU0: Temperature/speed normal
Machine check events logged

确认没有超频,检查了 CPU 风扇,散热没有问题,CPU 的温度较之使用 2.4 内核的时候也没有升高。
可是,只要编译东西就会说 CPU 温度过高,CPU 占用率稍微高一些也会频繁出现上面的两行警告,让人好生心烦。

查询资料后得知是 2.6 内核的相应阀值过低造成了这种状况。

vi /etc/syslog.conf
注释掉 *.emerg 这一行
/etc/init.d/syslog restart

netfilter conntrack调优(iptables使用)

原文http://www.wallfire.org/misc/netfilter_conntrack_perf.txt
中文版http://www.linuxmine.com/5791.html

大意如下
有两点我们要注意.
-conntrack最大数量.叫做conntrack_max
-存储这些conntrack的hash表的大小,叫做hashsize

当conntrack入口数大于conntrack_max时,在hash表中每一个conntrack list中的存储的入口将不可控.(conntrack_mark/hashsize 为每个list所能存储的入口的数量)

hash表存在于固定的的不可swap的内存中. conntrack_mark决定占用多少这些不可swap的内存.

缺省的hashsize
——————————–
conntrack_max=hashsize*8
i386中 hashsize=conntrack_max/8=ramsize(in bytes)/131072=ramsize(in MegaBytes)*8.
所以32位pc,512M内存可以存512*1024^2/128/1024=512*8=4096(连接池list)

但是正确的算法是:
hashsize=conntrack_max/8=ramsize(in bytes)/131072/(x/32)
x表示使用的指针类型是(32位还是64的)

—————————-\
读取conntrack_max值
cat /proc/sys/net/ipv4/ip_conntrack_max

读取hashsize值
cat /proc/sys/net/ipv4/netfilter/ip_conntrack_buckets

——————————
你可修改这两个值以适应高负载的netfilter的应用
系统默认为conntrack_max:hashsize是8:1,你可以设成1:1以提高性能.

————————-
设置conntrack_max
echo $CONNTRACK_MAX > /proc/sys/net/ipv4/ip_conntrack_max

设置hashsize
如果(netfilter conntrack静态编译在内核中),2.4中可以在编译时设置,2.6可以在启动中(boot时)加入ip_conntrack.hashsize=$hashsize
如果为modules,则可以使用 modprobe ip_conntrack hashsize=$hashsize

————————–
conntrack使用的内存计算
size_of_mem_used_by_conntrack (in bytes) =
CONNTRACK_MAX * sizeof(struct ip_conntrack) +
HASHSIZE * sizeof(struct list_head)
其中sizeof(struct ip_conntrack)大概在192-352字节之间.
sizeof(struct list_head) = 2 * size_of_a_pointer(i386中为4字节)

一个例子512m内存,使用384m来用于conntrack则
384*1024*1024/(352+8)(使用它是保守计算) =~1143901 (此为conntrack:hashszie为1:1,352为sizeof(ip_conntrack),8为sizeof(list_head).
由于hash最好设为2的乘方的数,所以为1048576(2^20).

———————

附相关设置及命令:
ip_conntrack timeout 原值432000秒(5天)
可改为10小时,echo “600” > /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_established

ip_conntrack buffer使用情况
grep conn /proc/slabinfo
例ip_conntrack      188069 229570    336   11    1 : tunables   54   27    8 : slabdata  20870

相关修改:
echo “1024 65000” > /proc/sys/net/ipv4/ip_local_port_range
echo “100 1200 128 512 15 5000 500 1884 2”>/proc/sys/vm/bdflush
echo “1” > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
echo “1” > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses
echo “1048576” > /proc/sys/net/ipv4/netfilter/ip_conntrack_max
echo “1” > /proc/sys/net/ipv4/ip_forward
echo “268435456” >/proc/sys/kernel/shmall
echo “536870912” >/proc/sys/kernel/shmmax
echo “600” > /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_established
echo “1024” > /proc/sys/net/ipv4/neigh/default/gc_thresh1
echo “2048” > /proc/sys/net/ipv4/neigh/default/gc_thresh2
echo “4096” > /proc/sys/net/ipv4/neigh/default/gc_thresh3
echo “52428800” > /proc/sys/net/ipv4/route/max_size
echo “1” > /proc/sys/net/ipv4/conf/all/proxy_arp
echo “1” > /proc/sys/net/ipv4/tcp_window_scaling

如果系统日志出现下面信息:
Nov 19 22:18:10 Server kernel: printk: 3 messages suppressed.
Nov 19 22:26:50 Server kernel: printk: 10 messages suppressed.
Nov 19 23:41:25 Server kernel: printk: 3 messages suppressed.
Nov 19 23:41:31 Server kernel: printk: 14 messages suppressed.
Nov 19 23:41:36 Server kernel: printk: 11 messages suppressed.
Nov 19 23:41:40 Server kernel: printk: 7 messages suppressed.
Nov 19 23:41:45 Server kernel: printk: 8 messages suppressed.
Nov 19 23:41:51 Server kernel: printk: 9 messages suppressed.
Nov 19 23:41:55 Server kernel: printk: 3 messages suppressed.
Nov 19 23:42:01 Server kernel: printk: 4 messages suppressed.
Nov 19 23:42:11 Server kernel: printk: 2 messages suppressed.
Nov 19 23:42:20 Server kernel: printk: 2 messages suppressed.
Nov 19 23:42:28 Server kernel: printk: 1 messages suppressed.
Nov 20 02:06:48 Server last message repeated 6 times
Nov 20 02:12:50 Server kernel: printk: 8 messages suppressed.
Nov 20 02:13:12 Server kernel: printk: 2 messages suppressed.
Nov 20 02:13:23 Server kernel: printk: 2 messages suppressed.
Nov 20 02:13:30 Server kernel: printk: 1 messages suppressed.
Nov 20 02:13:40 Server kernel: printk: 1 messages suppressed.
Nov 20 02:24:04 Server kernel: printk: 14 messages suppressed.
Nov 20 02:24:09 Server kernel: printk: 24 messages suppressed.
Nov 20 02:24:14 Server kernel: printk: 24 messages suppressed.
Nov 20 02:24:19 Server kernel: printk: 23 messages suppressed.
Nov 20 02:24:24 Server kernel: printk: 24 messages suppressed.
Nov 20 02:24:29 Server kernel: printk: 24 messages suppressed.
Nov 20 02:24:34 Server kernel: printk: 20 messages suppressed.
Nov 20 02:24:39 Server kernel: printk: 24 messages suppressed.
Nov 20 02:24:44 Server kernel: printk: 23 messages suppressed.
Nov 20 02:24:49 Server kernel: printk: 24 messages suppressed.
Nov 20 02:31:53 Server kernel: printk: 23 messages suppressed.
Nov 20 08:54:55 Server sshd(pam_unix)[4593]: session opened for user root by root(uid=0)
修改:
/proc/sys/net/ipv4/neigh/default/gc_thresh1
/proc/sys/net/ipv4/neigh/default/gc_thresh2
/proc/sys/net/ipv4/neigh/default/gc_thresh3
的值

linux lvm动态管理空间

     LVM逻辑盘卷管理应该是一个系统磁盘管理的趋势,可以减少系统安装规划的难度,linux的lvm虽然和aix使用上相比还差很多,但也可以减轻一些系 统管理员工作,避免一次就将所有的磁盘容量分配掉,造成个别空间的浪费,而个别空间运行一段时间后又剩余空间不足!

     可能日常使用比较多就是建立vg, lv, 扩展lv空间,特别是最后一个。之前测试过,都很正常,在上周操作,却老是出现错误,后来,发觉是一个低级的错误造成。

     简单的测试如下:

一些帮助命令

[root@jxdb2 ~]# lvm help
[root@jxdb2 ~]# lvm version
LVM version:     2.02.21-RHEL4 (2007-03-26)
Library version: 1.02.17-RHEL4 (2007-02-02)
Driver version:  4.5.5

[root@jxdb2 ~]# lvm lvresize –help

检查当前分区大小

[root@jxxdb2 ~]# df -h

Filesystem            Size  Used Avail Use% Mounted on

/dev/mapper/VolGroup00-LogVol00

                       15G  3.7G  9.9G  27% /u01/oracle/oradata

 

[root@jxxdb2 ~]# cat /etc/fstab

 

检查vg还有多少空间没有分配以及当前lv的大小

[root@jxxdb2 ~]# vgdisplay | egrep “Volume group|VG Name|Alloc PE|Free  PE”

  — Volume group —

  VG Name               VolGroup00

  Alloc PE / Size       610 / 19.06 GB

  Free  PE / Size       11107 / 347.09 GB

 

[root@jxxdb2 ~]# lvdisplay | egrep ” Logical volume|LV Name|VG Name|LV Size”

  — Logical volume —

  LV Name                /dev/VolGroup00/LogVol00

  VG Name                VolGroup00

  LV Size                14.50 GB

  — Logical volume —

  LV Name                /dev/VolGroup00/LogVol01

  VG Name                VolGroup00

  LV Size                4.56 GB

 

 

离线操作,如果umount 不行,确定服务停止的情况下,使用umount -l

[root@jxxdb2 ~]# umount /u01/oracle/oradata

 

动态增加2G的大小

[root@jxxdb2 ~]# lvextend -L+2G /dev/VolGroup00/LogVol00

  Extending logical volume LogVol00 to 16.50 GB

  Logical volume LogVol00 successfully resized

 

或者直接指定大小,用如下:

[root@jxxdb2 ~]# lvextend -L 18G /dev/VolGroup00/LogVol00

 

检查分区并自动调整文件系统到分区的新容量

[root@jxxdb2 ~]# e2fsck -f /dev/VolGroup00/LogVol00

 

[root@jxxdb2 ~]# resize2fs /dev/VolGroup00/LogVol00

 

重新mount分区

[root@jxxdb2 ~]# mount /u01/oracle/oradata

 

检查修改后的大小

[root@jxxdb2 ~]# df -h

Filesystem            Size  Used Avail Use% Mounted on  

/dev/mapper/VolGroup00-LogVol00

                       17G  3.7G   12G  24% /u01/oracle/oradata

 

 

[root@jxxdb2 ~]# lvdisplay | egrep ” Logical volume|LV Name|VG Name|LV Size”

  — Logical volume —

  LV Name                /dev/VolGroup00/LogVol00

  VG Name                VolGroup00

  LV Size                17.0 GB

  — Logical volume —

  LV Name                /dev/VolGroup00/LogVol01

  VG Name                VolGroup00

  LV Size                4.56 GB

直接在线操作 

http://www.redhat.com/magazine/009jul05/features/lvm2/
lvextend -L+10G /dev/myvg/homevol
ext2online /dev/myvg/homevol

减少逻辑卷大小

先执 e2fsck, 再执行 resize2fs,然后才 lvreduce

[root@jxdb2 /]# umount /vm
[root@jxdb2 /]# e2fsck -f /dev/VolGroup00/LogVol02
[root@jxdb2 /]# resize2fs /dev/VolGroup00/LogVol02 20G
[root@jxdb2 /]# lvreduce -L 20G /dev/VolGroup00/LogVol02
WARNING: Reducing active logical volume to 20.00 GB
THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce LogVol02? [y/n]: y

[root@jxdb2 /]# mount /vm
[root@jxdb2 /]# cd /vm
[root@jxdb2 vm]# ls
[root@jxdb2 /]# du -sm /vm

检查数据无丢失,但这个操作要很很小心,提示也说可能:MAY DESTROY YOUR DATA

删除逻辑卷以前首先需要将其卸载,然后删除:

# umount /dev/VolGroup00/LogVol02
# lvremove /dev/VolGroup00/LogVol02

LINUX下修改日期时间的方法

Linux机器上的时间比较复杂,有各式各样的时钟和选项等等。

机器里有两个时钟。硬件时钟从根本上讲是CMOS时钟,而系统时钟是由内核维护的。

1.修改硬件时钟的可以使用下面的方法:

你就可以用它来随时更新你的硬件时间,命令为:

hwclock –adjust
硬件时钟通常被设置成全球标准时间(UTC),而将时区信息保存在/usr/share/lib/timezone (或者在某些系统中可能是/usr/local/timezone)目录下某个适当的文件中,然后用一个符号链接文件/etc/localtime指向 它。

查看硬件时钟用命令:
hwclock –show

重置硬件时钟用:
hwclock –set –date=”07/08/05 10:10:59″

如果需要修改你的时区信息,可以使用tzset命令,如果你系统中没有这条命令,那可以用类似下面的操作:

ln -s /etc/localtime /usr/share/zoneinfo/US/Pacific

2.修改系统时钟的可以使用下面的方法:

data 10110155 就可以将时间调整为10月日凌晨1点55分

比如将系统时间设定成2005年8月8日的命令如下。

#date -s 2005/08/08
将系统时间设定成下午8点12分0秒的命令如下。
#date -s 20:12:00

这是修改系统时钟,由于LINUX系统是间隔一段时间才重新写硬件时钟,
因此使用date -s修改完成之后,马上重新启动计算机,就有可能修改的系统
时间没有写入CMOSS中,所以最好
#clock -w
这个命令强行写入CMOS。