Skip to content


用scponly创建一个chroot环境的sftp

使用scponly可以使用户只能运行scp / sftp等命令,与rsync、subversion、gftp兼容,对winscp这个open source for Windows的client端支持很好.

scponly官网
http://sublimation.org/scponly/

服务器为as4
#wget http://nchc.dl.sourceforge.net/sourceforge/scponly/scponly-4.8.tgz
#tar zxvf scponly-4.8.tgz
#cd scponly-4.8
#./configure –prefix=/usr/local/scponly –enable-chrooted-binary –enable-winscp-compat –enable-sftp-logging-compat –enable-scp-compat –enable-rsync-compat –enable-passwd-compat
#make
#make install
#echo /usr/local/scponly/sbin/scponlyc >> /etc/shells
#make jail

/usr/bin/install -c -d /usr/local/scponly/bin
/usr/bin/install -c -d /usr/local/scponly/man/man8
/usr/bin/install -c -d /usr/local/scponly/etc/scponly
/usr/bin/install -c -o 0 -g 0 scponly /usr/local/scponly/bin/scponly
/usr/bin/install -c -o 0 -g 0 -m 0644 scponly.8 /usr/local/scponly/man/man8/scponly.8
/usr/bin/install -c -o 0 -g 0 -m 0644 debuglevel /usr/local/scponly/etc/scponly/debuglevel
if test “xscponlyc” != “x”; then                        \
        /usr/bin/install -c -d /usr/local/scponly/sbin;              \
        rm -f /usr/local/scponly/sbin/scponlyc;                 \
        cp scponly scponlyc;                            \
        /usr/bin/install -c -o 0 -g 0 -m 4755 scponlyc /usr/local/scponly/sbin/scponlyc;      \
fi
chmod u+x ./setup_chroot.sh
./setup_chroot.sh
 
Next we need to set the home directory for this scponly user.
please note that the user’s home directory MUST NOT be writeable
by the scponly user. this is important so that the scponly user
cannot subvert the .ssh configuration parameters.
 
for this reason, a writeable subdirectory will be created that
the scponly user can write into.
 
Username to install [scponly]larry
home directory you wish to set for this user [/home/larry]
name of the writeable subdirectory [incoming]incoming
ldconfig: /usr/lib/libmcrypt.so.4 is not a symbolic link
 
 
creating  /home/larry/incoming directory for uploading files
 
Your platform (Linux) does not have a platform specific setup script.
This install script will attempt a best guess.
If you perform customizations, please consider sending me your changes.
Look to the templates in build_extras/arch.
 – joe at sublimation dot org
 
please set the password for larry:
Changing password for user larry.
New UNIX password:
BAD PASSWORD: it is too simplistic/systematic
Retype new UNIX password:
Sorry, passwords do not match
New UNIX password:
BAD PASSWORD: it is too simplistic/systematic
Retype new UNIX password:
passwd: all authentication tokens updated successfully.
if you experience a warning with winscp regarding groups, please install
the provided hacked out fake groups program into your chroot, like so:
cp groups /home/larry/bin/groups

#ll /home/larry/
drwxr-xr-x  2 root  root  4096 11月 10 11:23 bin
drwxr-xr-x  2 root  root  4096 11月 10 11:23 etc
drwxr-xr-x  2 larry larry 4096 11月 10 11:26 incoming
drwxr-xr-x  3 root  root  4096 11月 10 11:23 lib
drwxr-xr-x  5 root  root  4096 11月 10 11:23 usr

larry用户登录后只能在incoming目录里传东西

创建新用户需在编辑目录里执行setup_chroot.sh
#./setup_chroot.sh

#mkdir /home/larry/dev
#cp -a /dev/null /home/larry/dev/
64位系统
# mkdir /home/larry/lib64
# cp /lib64/ld-linux-x86-64.so.2 /home/larry/lib64/

参考:http://bbs.chinaunix.net/viewthread.php?tid=785820
http://hi.baidu.com/fengzhenjie/blog/item/2a4b1e7fe072ba0e29388a66.html

Posted in linux 维护优化, 安全, 技术.

Tagged with , .


用squid缓存jsp加速lucene搜索

前面尝试了使用nginx负载均衡lucene,效果还不错,但更新维护比较麻烦。
搜索来源中大部分是由连接方式过来,所以大部分的页面内容相同,可以使用缓存的方式重复使用。

方案一:用nginx的proxy stone
方案二:用nginx的ncache
方案三:用Varnish
方案四:用squid

方案一和方案二:
方案一和二是副本概念不会自动更新缓存,需写脚本来控制
都要使用nginx 的rewrite将html转成jsp
修改jsp中分页等连接地址为html
方案二需修改jsp在header中增加max-age
尝试结果:
jsp的参数超过了10个,但nginx只支持10个,所以不能缓存所有页面,但可以尝试缓存最常用的关键词第一页。
linux上好像没法将文件缓存起来并且没log,以下是windows上error.log
——————————————————
2008/11/04 16:39:16 [crit] 2828#0: *3 rename() “/proxy_temp/0000000004” to “html/locals.c1gstudio.com/search/” failed (21: Is a directory) while reading upstream, client: 127.0.0.1, server: locals.c1gstudio.com, request: “GET /search/ HTTP/1.1”, upstream: “http://192.168.1.50:8080/search/”, host: “locals.c1gstudio.com”
2008/11/04 16:39:19 [crit] 2828#0: *1 rename() “/proxy_temp/0000000013” to “html/locals.c1gstudio.com/search/result.jsp?keyword=+%E7%BC%96%E8%BE%91&city=0&type=0&do=1” failed (2: No such file or directory) while reading upstream, client: 127.0.0.1, server: locals.c1gstudio.com, request: “GET /search/result.jsp?keyword=+%E7%BC%96%E8%BE%91&city=0&jobtype=0&do=1 HTTP/1.1”, upstream: “http://192.168.1.50:8080/search/result.jsp?keyword=+%E7%BC%96%E8%BE%91&city=0&type=0&do=1”, host: “locals.c1gstudio.com”, referrer: http://locals.c1gstudio.com/search/
——————————————————-
貌似不必rewrite也可缓存。=_=!!!

方案三:
缓存放在内存里,软件重启后需重新生成,瞬时并发比较大
网卡流量也比较多,性能也比squid差。
参考it流言终结者的比较
IT流言终结者1续篇:varnish vs squid
IT流言终结者1:Varnish vs Squid
http://www.hiadmin.com/category/service/squid-app/

方案四:
以前有架设过,改改配置就可以上了。
选择squid2.6stable22,据测试性能稳定。

架设参考
squid 安装
http://blog.c1gstudio.com/archives/130

squid.conf中
开1.5G内存,4G硬盘
cache_store_log none
access_log none

refresh_pattern -i \.html$  60       25%     240
refresh_pattern -i \.htm$   60       25%     240
refresh_pattern -i \.jsp$   5       25%     20

refresh_pattern -i \.gif$   1440    50%     2880      ignore-reload
refresh_pattern -i \.jpg$   1440    50%     2880      ignore-reload
refresh_pattern -i \.jpeg$  1440    50%     2880     ignore-reload
refresh_pattern -i \.png$   1440    50%     2880      ignore-reload

总结:
最终架构是
nginx(80)->squid(81)->tomcat(8080)
nginx 跑在80端口代理81
squid 跑81端口代理远程的tomcat (squid跑在80会报access denied,忘改这个了acl Safe_ports port 81)
tomcat 在另一台机器上

jsp中header增加max-age=3600和相应expires,让页面在ie中缓存一小时,squid中缓存5~20分钟。

目前的负载
跑nginx和squid的 load average: 0.18, 0.14, 0.08 以前是load为1左右
跑tomcat的 load average: 1.57, 1.41, 1.28 以前load为3左右

现在改动程序只需改动一台机器,结果很满意哈~

 

Posted in Nginx, Squid/varnish.

Tagged with , , , .


[转]iostat 介绍

2. iostat 结果解析

# iostat -x
Linux 2.4.21-9.30AX (localhost) 2004年07月14日

avg-cpu: %user %nice %sys %idle
3.85 0.00 0.95 95.20

Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util
/dev/hda 1.70 1.70 0.82 0.82 19.88 20.22 9.94 10.11 24.50 11.83 57.81 610.76 99.96
/dev/hda1 0.00 0.00 0.00 0.00 0.01 0.00 0.00 0.00 12.92 0.00 10.77 10.77 0.00
/dev/hda5 0.02 0.00 0.00 0.00 0.03 0.00 0.02 0.00 6.60 0.00 6.44 6.04 0.00
/dev/hda6 0.01 0.38 0.05 0.03 0.43 3.25 0.21 1.62 46.90 0.15 193.96 52.25 0.41
/dev/hda7 1.66 1.33 0.76 0.79 19.41 16.97 9.70 8.49 23.44 0.79 51.13 19.79 3.07

rrqm/s: 每秒进行 merge 的读操作数目。即 delta(rmerge)/s
wrqm/s: 每秒进行 merge 的写操作数目。即 delta(wmerge)/s
r/s: 每秒完成的读 I/O 设备次数。即 delta(rio)/s
w/s: 每秒完成的写 I/O 设备次数。即 delta(wio)/s
rsec/s: 每秒读扇区数。即 delta(rsect)/s
wsec/s: 每秒写扇区数。即 delta(wsect)/s
rkB/s: 每秒读K字节数。是 rsect/s 的一半,因为每扇区大小为512字节。
wkB/s: 每秒写K字节数。是 wsect/s 的一半。
avgrq-sz: 平均每次设备I/O操作的数据大小 (扇区)。即 delta(rsect+wsect)/delta(rio+wio)
avgqu-sz: 平均I/O队列长度。即 delta(aveq)/s/1000 (因为aveq的单位为毫秒)。
await: 平均每次设备I/O操作的等待时间 (毫秒)。即 delta(ruse+wuse)/delta(rio+wio)
svctm: 平均每次设备I/O操作的服务时间 (毫秒)。即 delta(use)/delta(rio+wio)
%util: 一秒中有百分之多少的时间用于 I/O 操作,或者说一秒中有多少时间 I/O 队列是非空的。
即 delta(use)/s/1000 (因为use的单位为毫秒)

如果 %util 接近 100%,说明产生的I/O请求太多,I/O系统已经满负荷,该磁盘
可能存在瓶颈。

svctm 一般要小于 await (因为同时等待的请求的等待时间被重复计算了),
svctm 的大小一般和磁盘性能有关,CPU/内存的负荷也会对其有影响,请求过多
也会间接导致 svctm 的增加。await 的大小一般取决于服务时间(svctm) 以及
I/O 队列的长度和 I/O 请求的发出模式。如果 svctm 比较接近 await,说明
I/O 几乎没有等待时间;如果 await 远大于 svctm,说明 I/O 队列太长,应用
得到的响应时间变慢,如果响应时间超过了用户可以容许的范围,这时可以考虑
更换更快的磁盘,调整内核 elevator 算法,优化应用,或者升级 CPU。

队列长度(avgqu-sz)也可作为衡量系统 I/O 负荷的指标,但由于 avgqu-sz 是
按照单位时间的平均值,所以不能反映瞬间的 I/O 洪水。
3. I/O 系统 vs. 超市排队

举一个例子,我们在超市排队 checkout 时,怎么决定该去哪个交款台呢? 首当
是看排的队人数,5个人总比20人要快吧? 除了数人头,我们也常常看看前面人
购买的东西多少,如果前面有个采购了一星期食品的大妈,那么可以考虑换个队
排了。还有就是收银员的速度了,如果碰上了连钱都点不清楚的新手,那就有的
等了。另外,时机也很重要,可能 5 分钟前还人满为患的收款台,现在已是人
去楼空,这时候交款可是很爽啊,当然,前提是那过去的 5 分钟里所做的事情
比排队要有意义 (不过我还没发现什么事情比排队还无聊的)。

I/O 系统也和超市排队有很多类似之处:

r/s+w/s 类似于交款人的总数
平均队列长度(avgqu-sz)类似于单位时间里平均排队人的个数
平均服务时间(svctm)类似于收银员的收款速度
平均等待时间(await)类似于平均每人的等待时间
平均I/O数据(avgrq-sz)类似于平均每人所买的东西多少
I/O 操作率 (%util)类似于收款台前有人排队的时间比例。

我们可以根据这些数据分析出 I/O 请求的模式,以及 I/O 的速度和响应时间。
4. 一个例子

# iostat -x 1
avg-cpu: %user %nice %sys %idle
16.24 0.00 4.31 79.44
Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util

/dev/cciss/c0d0
0.00 44.90 1.02 27.55 8.16 579.59 4.08 289.80 20.57 22.35 78.21 5.00 14.29
/dev/cciss/c0d0p1
0.00 44.90 1.02 27.55 8.16 579.59 4.08 289.80 20.57 22.35 78.21 5.00 14.29
/dev/cciss/c0d0p2
0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00

 

上面的 iostat 输出表明秒有 28.57 次设备 I/O 操作: delta(io)/s = r/s +
w/s = 1.02+27.55 = 28.57 (次/秒) 其中写操作占了主体 (w:r = 27:1)。

平均每次设备 I/O 操作只需要 5ms 就可以完成,但每个 I/O 请求却需要等上
78ms,为什么? 因为发出的 I/O 请求太多 (每秒钟约 29 个),假设这些请求是
同时发出的,那么平均等待时间可以这样计算:

平均等待时间 = 单个 I/O 服务时间 * ( 1 + 2 + … + 请求总数-1) / 请求总数

应用到上面的例子: 平均等待时间 = 5ms * (1+2+…+28)/29 = 70ms,和
iostat 给出的 78ms 的平均等待时间很接近。这反过来表明 I/O 是同时发起的。

每秒发出的 I/O 请求很多 (约 29 个),平均队列却不长 (只有 2 个 左右),
这表明这 29 个请求的到来并不均匀,大部分时间 I/O 是空闲的。

一秒中有 14.29% 的时间 I/O 队列中是有请求的,也就是说,85.71% 的时间里
I/O 系统无事可做,所有 29 个 I/O 请求都在142毫秒之内处理掉了。

delta(ruse+wuse)/delta(io) = await = 78.21 => delta(ruse+wuse)/s =
78.21 * delta(io)/s = 78.21*28.57 = 2232.8,表明每秒内的I/O请求总共需
要等待2232.8ms。所以平均队列长度应为 2232.8ms/1000ms = 2.23,而 iostat
给出的平均队列长度 (avgqu-sz) 却为 22.35,为什么?! 因为 iostat 中有
bug,avgqu-sz 值应为 2.23,而不是 22.35。
以下为服务器情况

bbs(scsi 74G)
top – 17:06:00 up 61 days, 11 min,  3 users,  load average: 3.98, 3.72, 3.53
Tasks: 250 total,   3 running, 247 sleeping,   0 stopped,   0 zombie
Cpu(s): 15.4% us,  3.7% sy,  0.0% ni, 74.6% id,  6.2% wa,  0.1% hi,  0.0% si
Mem:   2073976k total,  1922724k used,   151252k free,    36372k buffers
Swap:  2040244k total,    46416k used,  1993828k free,  1007456k cached
 
avg-cpu:  %user   %nice %system %iowait  %steal   %idle
          15.17    0.00    3.65    6.21    0.00   75.02
 
Device:         rrqm/s   wrqm/s     r/s     w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await  svctm  %util
sda               0.13    55.67   12.19   30.50   215.93   690.06    21.22     0.17    3.93   5.22  22.30
search1(sata 80G)
top – 17:06:32 up 4 days,  4:31,  2 users,  load average: 1.02, 1.31, 1.19
Tasks:  86 total,   1 running,  85 sleeping,   0 stopped,   0 zombie
Cpu(s): 32.3% us,  0.9% sy,  0.0% ni, 62.2% id,  4.2% wa,  0.2% hi,  0.2% si
Mem:   2074476k total,  2060532k used,    13944k free,   260740k buffers
Swap:  4096532k total,    16264k used,  4080268k free,   159984k cached
 
avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           9.00    0.00    1.62    5.80    0.00   84.02
 
Device:         rrqm/s   wrqm/s     r/s     w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await  svctm  %util
hda               0.05    35.22   18.19   12.87   189.80   384.73    18.50     5.59  179.86   7.44  23.12

search2(scsi 74G *2 )
top – 17:07:15 up 17 days, 21:34,  2 users,  load average: 2.21, 2.78, 2.82
Tasks: 155 total,   1 running, 154 sleeping,   0 stopped,   0 zombie
Cpu(s): 13.2% us,  4.7% sy,  0.0% ni, 77.7% id,  4.0% wa,  0.0% hi,  0.3% si
Mem:   2074936k total,  2003708k used,    71228k free,    74260k buffers
Swap:  2031608k total,   342032k used,  1689576k free,   197840k cached
 
avg-cpu:  %user   %nice %system %iowait  %steal   %idle
          21.67    0.00    6.25    4.39    0.00   67.94
 
Device:         rrqm/s   wrqm/s     r/s     w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await  svctm  %util
sda               0.03     6.66    1.77    2.68    86.44    75.11    36.32     0.13   29.63   4.83   2.15
sdb               0.29    69.29   29.10   13.90   340.41   665.65    23.40     0.62   14.43   4.33  18.64

www (sas 15K 146G *2 raid 1)
top – 17:07:56 up 17 days, 20:33,  1 user,  load average: 0.16, 0.27, 0.26
Tasks: 161 total,   1 running, 160 sleeping,   0 stopped,   0 zombie
Cpu(s):  1.1%us,  0.2%sy,  0.0%ni, 98.2%id,  0.4%wa,  0.0%hi,  0.1%si,  0.0%st
Mem:   8174384k total,  8113268k used,    61116k free,   277316k buffers
Swap:  8191992k total,      140k used,  8191852k free,  6900728k cached
 
avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           2.00    0.00    0.79    0.22    0.00   97.09
 
Device:         rrqm/s   wrqm/s     r/s     w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await  svctm  %util
sda               0.13    31.81    0.41    8.54    19.85   322.79    38.32     0.58   64.46   2.50   2.24
dm-0              0.00     0.00    0.01    3.92     0.40    31.39     8.08     0.19   47.19   1.44   0.57
dm-1              0.00     0.00    0.46   34.35    18.40   274.76     8.42     1.14   32.63   0.53   1.85
dm-2              0.00     0.00    0.00    0.23     0.00     1.82     8.00     0.01   31.41   8.79   0.20
dm-3              0.00     0.00    0.06    0.57     1.00     4.53     8.89     0.02   35.87   3.40   0.21
dm-4              0.00     0.00    0.00    0.00     0.01     0.02     8.00     0.00   15.83   0.35   0.00
dm-5              0.00     0.00    0.00    1.28     0.04    10.27     8.00     0.16  125.45   0.08   0.01

参考:http://blog.chinaunix.net/u/27493/showart.php?id=498055

Posted in LINUX, 其它, 分析报告, 技术.

Tagged with .


Nginx for Windows

kevin写的nginx for windows 支持(Windows Vista, Windows XP, Windows 2000)
他的主页:
http://www.kevinworthington.com/nginx/win32/
目前有三个主流版本下载:

Branch Download Package Release Date
Development 0.7.19 13 October 2008
Stable 0.6.32 07 July 2008
Legacy 0.5.37 07 July 2008

tips:请不要用在生产环境,仅供开发测试。

一。下载
我这里下载0.6.32版http://www.kevinworthington.com/nginx/win32/nginx-0.6.32-win32-setup.exe
下载后安装到c:\nginx。

PHP 官方下载php
我这里下载PHP 5.2.6 zip package
下载后以解压到c:\php。

二。配置nginx
下面这张截图内容为廖老师 nginx 配置单:

上图中用红线椭圆圈起来的,是nginx php 配置的关键部分,没配置正确会出现404错误,让我郁闷很久。
如果你的程式放在有空格的文件夹下如program files下,可以用以下方法。
     include fcgi.conf;    
     set $rootpath “D:\Program Files\wamp\www”;
     fastcgi_param SCRIPT_FILENAME $rootpath$fastcgi_script_name;

三。启动nginx
执行c:\nginx\Start-nginx.bat启动
启动php的cgi server

关于php cgi server 可以使用以下命令:

      php-cgi.exe -b 127.0.0.1:9000 -q

这样做,缺陷是命令行窗口一直打开,若关闭那cgi server 也关闭啦。到网上下载RunHiddenConsole.exe 可以使命令行窗口隐藏啦。
       RunHiddenConsole.exe php-cgi.exe -b 127.0.0.1:9000 -q

你也可以写一个批处理来做这件事:

start_phpcgi.bat
 @ECHO OFF
ECHO Starting PHP FastCGI…
RunHiddenConsole.exe c:/php/php-cgi.exe -b 127.0.0.1:9000 -q
EXIT

关闭的批处理
stop_phpcgi.bat
@ECHO OFF
ECHO Stopping PHP FastCGI…
bin\process.exe -k php-cgi.exe >nul
ECHO.
EXIT

最后写一个简单PHPINFO来验证PHP 是否工作正常。

参考:http://blog.chinaitlab.com/html/30/104830-166195.html

Posted in Nginx, 技术.

Tagged with , , .


[转载]程式設計師的格言

via Tsung’s Blog

Tsung’s Blog 上看到这篇东西,发现里面的一些格言实在太经典、太贴切了!我觉得这个应该是和技术相关的,贴在这里,估计有共鸣的人应该很多。:)

先摘录几个经典的(做了小幅修改,替换了一些繁体术语):

要殺一個程式設計師不需要刀,改三次需求就好

程式是運氣與直覺堆砌而成的奇蹟。
若不具備這兩者,不可能以這樣的工期實現這樣的需求。
修改需求是對奇蹟吐槽的亵渎行為。
而追加修改則是相信奇蹟還會重現的無謀行動。

追加需求確定後交貨期限就無法確定,
交貨期限確定後追加需求就無法確定。
這稱為「追加需求與交貨期限的測不準原理」。

原文出处:程式設計師的格言 « but, or bug
——————————————————————————

程式設計師的格言(盜作不少)

譯自

* プログラマーの格言(盗作多し)
* http://mixi.jp/view_community.pl?id=1772737

(版本2 2008/10/12更新)

譯註

* SE是日本軟體公司裡程式設計師的頭子。自己不太寫程式,主要工作是跟客戶確認規格。
* 程式設計師多半自己不面對客戶。
* 跟PM又不一樣。(有什麼比較貼切的職稱翻譯嗎?)

1. 每天有24小時。
所謂的「今天之內」,是指到明天早上為止。
2. 程式不會照自己所想的跑。只會照所寫的跑。
3. 需求規格在程式寫完後才會敲定。
基本規格要客戶看到成品後才會決定。
詳細規格要使用者用過後才會確定。
4. 我對軟體設計的方式導出的結論,有兩種方式。
一是把軟體設計得單純到很明顯不會有缺陷,
不然就是把軟體設計得複雜到沒有明顯的缺陷。
– C.A.R.Hoare
5. 程式碼不要在開發現場寫! 去客戶那寫!
除錯不要在期限前做! 上線後再做!
6. 畫面是藍色的!
(國際太空站太空人重新安裝 Windows NT,日誌中的名句)
7. 先說「沒辦法」的人贏。
8. 有意見的話你寫
9. 要殺一個程式設計師不需要刀,改三次規格就好
10. 首先要先懷疑別人,被懷疑的人或許會把問題解決掉。
(註:通常會「先懷疑自己」)
11. 開發沒有終點。只有釋出(release)。
12. 無論規格多晚才能確定,結案期限永遠不會變。
這是所謂的「期限守恆定理」。
13. 客戶總是覺得水跟追加需求是不用錢的。
14. 付錢愈計較的客人愈囉唆。
15. 在排定開發行程時,總是視而不見一些連小學生都會的算數。
業務部門總是一堆不知道1+1=2的人。
16. 一個人掛了大家都掛了。
17. bug過了一晚可能就變成規格了。
18. 好的規格找一個天才不如找三個凡人。
爛的規格找一百個凡人不如找一個天才。
19. 客製軟體中30%的價格用在確認規格上。
30%用在修改規格上。
30%用在找bug。
結果初期規格反映在價格上占的比例只有10%。
20. 對客戶來說SE是部下,程式設計師是家畜。
對SE來說客人是錢,對程式設計師來說顧客是看不見的病毒。
除了弄完程式以外,沒有其他驅除的辦法。
21. 顧客想受SE喜歡,要自己了解到系統開發需要時間與金錢,早點確定規格。
SE想受顧客喜歡,則要讓程式設計師討厭自己。
22. 很多SE跟程式設計師都暗自想著有錢有閒的話什麼系統都想自己動手做,
不過都沒這種機會。
23. 品質的劣化程度依規格改變的次數與規模而定。
24. 業務是認為空想能夠實現的夢想家。
SE則是深信任何障礙都能突破的冒險家。
程式設計師則是被夢想家和冒險家拋到漆黑海裡的漂流者。
25. 有才能的程式設計師第一次看到設計細節時,要先理解程式的目的。
接下來要設法讓SE了解到以指定的方法、工時並無法完成這個工作。
26. 程式是運氣與直覺堆砌而成的奇蹟。
若不具備這兩者,不可能以這樣的工時實現這樣的規格。
修改規格是對奇蹟吐槽的褻瀆行為。
而追加修改則是相信奇蹟還會重現的無謀行動。
27. 程式設計師聽了「把自己當作顧客去著想!」而開始思考。
啊,像夢一樣。
28. 對於因為興趣而寫程式的人來說,所謂的技術是程式語言能力。
對於因為工作而寫程式的人來說,所謂的技術是邏輯思考能力與人際溝通能力。
程式語言可以看著手冊溝通,客戶不行。
29. 程式系統在交貨之前會不斷縮小。
先用元件定義取悅老闆。
再拿經費概算要部長妥協現實的方案。
在運用會議中,課長會嘗識減少自己責任範圍。
在細節會議中,負責人會把範圍縮到自己記得的部分。
30. SE需要持久力,程式設計師需要爆發力。
31. 準時離開公司,工作會變多。
32. 完美的程式需要完美的時間與金錢。
聽說揮霍著美國的國家預算的NASA,也覺得時間跟錢不夠。
33. 詳細設計要在程式碼的註解裡做完。
註解是唯一的自衛手段,至少要讓自己看懂。
34. 還有時間看程式碼的話就執行他。
CPU跑得比腦細胞快。至少這時候可以休息。
35. 程式的異常該稱為「bug」還是「規格上的限制」是看期限還剩多久決定的。
36. 所謂便服日,好像社會上把他叫做假日
(註) 日本有些公司會有所謂便服日(不用穿西裝的日子),通常是星期五,但…
37. 地獄持續一段時間後,充滿殺氣的怒吼會變多。
再持續一段時間,說話會變少但牢騷會變多,壟罩在凝重的氣氛裡。
再持續下去,反而會海闊天空,四周洋溢充滿活力的聲音。
這種狀態稱為「Programmer’s High」,也是倒下來的人開始出現的時候。
38. 遠處的火災一定燒到這裡。
39. 禱告,然後 “工作” 吧。(修道院的標語)
40. 程式不是用腦記的,要用身體記住。
41. 明天能放假的話死了也罷。
42. 外面有下雨耶,昨天開始下的嗎?
43. 心若不廢掉(消極),身體會廢掉。
若不讓自己殘忍,自己會被殺。
44. 客戶會說謊,業務會作夢,SE會做白日夢。
程式設計師則惦惦。(愈來愈自言自語)
45. SE總是不講理的(unreasonable)說「沒有辦不到(impossible)」,
業務總是沒辦法(impossible)說「沒道理(unreasonable)」。
46. 規格書就像航海圖,客戶則是洋流。洋流陰晴不定,航海圖就變垃圾。
程式設計師必須在沒有航海圖的海上憑自己的力量找到大陸。
47. 再嘮嘮叨叨下去也是要付錢的。
48. 多想個10秒鐘,你可以不說「嗯,這個做得到」。
49. 人是無法從別人失敗記取教訓的動物。
砍成本、改規格、加需求、趕上線,從來沒有人從眾多失敗中記取教訓。
50. 老手用來提振精神的魔法格言:
「不過比起以前來說算是…」
新人用來提起幹勁的魔法格言:
「把這件工作做完的話…」他們還不知道工作是沒有終點的。
51. 所謂交案期限,是指開發現場從公司換到客戶那裡的日子。
52. 程式、SE、經理不是職種。是職責。
53. 業務是最難搞的客戶。
54. 能夠迅速想到解法的程式設計師太多了。
他們能用一分鐘想到方法,用一天去寫程式。
不需要花一小時想到解法,再用一小時去寫程式。
– Jon Bentley
55. 漂亮的規格,可以從沒有bug出現看出來。
明明爛的就是設計,為什麼是這樣…
56. 上線後的除錯才叫做bug。
57. 追加需求確定後交貨期限就無法確定,
交貨期限確定後追加需求就無法確定。
這稱為「追加需求與交貨期限的測不準原理」。
58. 除三個錯就會冒出一個錯。
這稱為bug的無窮迴圈。
59. 不祥的預感總會實現。
不過程式設計師不會去煩惱不祥的預感,那是SE的工作。
60. 要解決地獄的辦法,就是客戶把錢交出來。
61. 不懂電腦的操作者是發現bug的天才。而且無法重現。
62. 每次開會就更改規格的客戶,
他的操作手冊要等到操作寫好的程式後才能寫出來。
63. 搞不懂的時候,Currency(長整數)比Interger(整數)好用。
Variant(字串、數字都能存的萬能變數)又比Currency(長整數)好用。
安全第一。
(VB程式設計師如是說)
64. 啊,那是微軟的規格。
65. 程式設計師所不滿的規格也一定會讓客戶不滿。
(這是說程式設計師覺得難寫的地方常常是SE溝通有落差)
66. 程式設計師需要的技能,
包括交涉、時程管理、業務分析、提案、設計、程式語言、架構、維護、使用。
SE需要的技能則減掉程式語言、架構、維護與使用。
專案經理需要的能力則再減掉業務分析、提案與設計。
業務需要的能力再扣掉時程管理。
67. 正因為健康,才能做不健康的事。
68. (這個不是 bug 嗎?)
規、規格、是規格啦。不過有一點跟規格不太一樣啦。
69. 那是你說的規格。
70. 開發室沒有窗戶,那是因為以前…
71. 即使爛了也是規格。
72. SE: 真沒辦法。
PG: 也沒註解。
(碰到不知道是誰寫的程式,大家都束手無策的狀態)
73. 為什麼你不能兩三下解決掉他啦。
因為之前兩三下搞定的東西也被你兩三下就否定了。
74. 不會動的bug就只是普通的bug。(會動的bug則能視為規格)
75. 今天好好清理bug,bug應該死光了吧。
咦?Windows也死了唷。
76. 客戶不會去想最壞的情況。要他面對最壞的情況,他會認為是漫天開價。
SE則會顧慮最壞的情況,準備應付最壞的情況。
程式設計師比誰都早預料到最壞的情況,而無視最壞的情況。
77. 唯一不產生bug的方法,就是不寫程式。
第二好的方法,就是在時程跟人員確定之後的每次改規格,都重新檢視過整個專案。
78. 共同責任是程式設計師的責任。
管理職?那是啥?好吃嗎?我沒吃過耶。
79. 如果可以改行的話,想找個準時下班不叫「逃跑」的工作。
80. 對職業程式設計師來說,漂亮的程式是單純而自然的邏輯、簡單而基本的指令、豐富的註解,
也就是新手程式設計師也能馬上動手改的程式。
而要寫出這樣的程式,需要單純、簡單、美麗的規格。
但可惜客人總是喜歡搞很複雜。
81. 設計者應該是不該要求製作者製作出超過設計以上內容的吧…
82. 無論是做的比規格書裡的多,還是只照規格書裡的寫,SE都會找程式設計師的碴。
所以程式設計師只做規格書裡的寫的內容。
83. SE對程式設計師說的「常識」每三小時變一次。
84. 自己看規格書。不能跑的是規格。
85. 「沒辦法」是要看把一天當多少小時來算。
一天常常指的是3人日,一個月常常是指4.5人月喔。
86. 工時要減掉一半的單體測試與一半的系統測試,
而交貨期則要另外加上上線後的兩個月。
87. 能拿到錢的規格變更稱為「受理項目」,
拿不到錢的規格變更則稱為「SE的規格確認失誤」。
程式設計師是這麼看的。
88. 累了。我想睡了。可以回家嗎。
(累了吧,我也累了。好累喔怎麼了。反正就是規格啦,管他的)
89. 試圖降低成本的話,為了配合預算,品質會下降,不過漫天開價做出來的品質也不見得好到哪裡去。
90. REDO到底該怎麼唸一直搞不懂。是利斗嗎、李度嗎、R E D O嗎,難道是 red 零 嗎? 拜託加上注音吧。
(譯註:我比較煩惱 Linux)
91. 有人在程式碼註解裡寫日記。像「今天是雨天…」,「想回家…」之類的。甚至還有「修改日: 2003/10/10 不能同意你更多」這種註解出現。說到這個,好像也看過「吃大便」這樣的註解。
92. 小學生時第一次看到電腦
國中時第一次學會怎麼用
高中與大學學會程式語言
出社會後才發現自己走錯路
93. 「不要讓老闆當業務比較好」
94. 說來說去,要去研究根本不知道為什麼會動的東西為什麼不會動了,找拿破崙來也沒搞頭。

ex 系列

1. 就算程式裡沒bug,編譯器會有bug。
就算編譯器沒bug,OS會有bug。
就算一切都沒bug,客戶會決定什麼是bug。
2. 規格與規格書是不同的東西。
3. 比期限更重要的是靈感與睡眠。
4. 比知識與經驗重要的是手冊與時間。
5. 能動就好了,能動的話…
6. 過了三天就是別人寫的程式碼。
7. (大搜查線系列)
規格變動不是在會議室裡發生的!是在現場發生的!
8. (大搜查線系列)
異常不是在模擬測試時發生的!是上線後才會發生的!
9. 漂亮的設計三天或許就膩了
骯髒的設計三天就習慣了
10. bug與規格是一體兩面
11. 電腦裡沒有bug,bug常在人心。
12. 無論怎麼檢查,不管怎麼確認,上線前一晚就是睡不著。(RFC968)
13. 估價需要1%的經驗與99%的直覺
14. 沒有什麼事情比直接讓找不到任何bug的程式直接上線還要可怕的了。
15.
* 『程式設計師』=能將SE條理不通的說明翻譯成程式碼的高手
* 『SE』=與客戶討論改寫規格書、與程式設計師討論後再改寫規格書,程式出貨後還要繼續改寫規格書的人
* 『PM』=每天修改自己定下的行程表的人
* 『業界老鳥』=臉色蒼白缺乏表情的人
* 『外包』=幫不會寫程式的正職員工寫程式的人
* 『coding』=複製貼上的工作
* 『單體測試』=指開始寫程式
* 『除錯』=把程式碼註解掉的工作
* 『新同事』=在火燒屁股的專案火上加油的人
* 『出貨日』=把只完成一半的系統上線的日子
* 『末班電車』=業界平均的下班時間
* 『颱風假』=一年一度可以準時下班的業界假日
16. 當誰寫的程式碼跑出bug時,那個人大概都不在了(墨菲定理?)
17. 最終手段
「重開機」
意外的常常都很有效
18. 最強藉口
以前「那是硬體的極限」
現在「那是Windows的規格」
19. 「程式碼的可信度,不會比寫的人還可信。」

Posted in 其它, 文档理论.

Tagged with .


使用vnstat监控流量

vnstat通/proc来监控流量,无需root权限,提供每日、每月等报表,并有php前台扩展。

经过几个月运行发现有时vnstat -d 只能看最近几天的
http://humdi.net/vnstat/

wget http://humdi.net/vnstat/vnstat-1.6.tar.gz
tar zxvf vnstat-1.6.tar.gz
cd vnstat-1.6
make && make install ; vnstat –testkernel && vnstat -u -i eth0

如果用户在一个64位平台上编译,应改用make 64bit命令.

添加crontab
crontab -e
0-55/5 * * * * if [ -x /usr/bin/vnstat ] && [ `ls/var/lib/vnstat/ | wc -l` -ge 1 ]; then /usr/bin/vnstat -u; fi

 vnStat 1.6 by Teemu Toivola

	 -q,  --query		 query database
	 -h,  --hours		 show hours
	 -d,  --days		 show days
	 -m,  --months		 show months
	 -w,  --weeks		 show weeks
	 -t,  --top10		 show top10
	 -s,  --short		 use short output
	 -u,  --update		 update database
	 -i,  --iface		 change interface (default: eth0)
	 -?,  --help		 short help
	 -v,  --version		 show version
	 -tr, --traffic		 calculate traffic
	 -l,  --live		 show transfer rate in real time

See also "--longhelp" for complete options list and "man vnstat".
$ vnstat
Database updated: Sun Dec  2 22:20:01 2007

	inet (eth0)

	   received:     735.00 GB (48.9%)
	transmitted:     769.38 GB (51.1%)
	      total:       1.47 TB

	                rx     |     tx     |  total
	-----------------------+------------+-----------
	yesterday     23.35 MB |   20.25 MB |   43.60 MB
	    today     27.47 MB |   21.37 MB |   48.84 MB
	-----------------------+------------+-----------
	estimated        29 MB |      22 MB |      51 MB
(with 2 interfaces)
$ vnstat

                     rx      /     tx      /    total    /  estimated
 Internet (eth1):
     yesterday    209.36 MB  /  322.88 MB  /  532.24 MB
         today      1.99 GB  /    2.46 GB  /    4.46 GB  /    4.67 GB

 Local (eth0):
     yesterday    248.27 MB  /    4.63 GB  /    4.87 GB
         today      2.31 GB  /    4.21 GB  /    6.52 GB  /    6.83 GB
$ vnstat -h
 inet (eth0)                                                              22:15
  ^                                                                 r
  |                                                                 rt r
  |                                                                 rt rt
  |                                                                 rt rt
  |                                                              r  rt rt
  |     rt                                                       r  rt rt
  |     rt                                                 rt    rt rt rt
  |  rt rt rt                                  r  r  rt r  rt r  rt rt rt
  |  rt rt rt                               r  rt rt rt rt rt rt rt rt rt
  |  rt rt rt rt r              r     r  r  r  rt rt rt rt rt rt rt rt rt rt
 -+--------------------------------------------------------------------------->
  |  23 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22    

 h   rx (kB)    tx (kB)      h   rx (kB)    tx (kB)      h   rx (kB)    tx (kB)
23      1,352      1,219    07        277        151    15      1,352      1,165
00      2,281      2,140    08        402        158    16      1,487        878
01      1,485      1,261    09        290        155    17      1,752      1,559
02        648        522    10        589        185    18      1,455      1,001
03        392        261    11        650        202    19      2,332      1,835
04        323        240    12        907        350    20      3,881      3,619
05        311        179    13      1,234      1,044    21      3,695      3,237
06        281        173    14      1,221        812    22        675        591
$ vnstat -d

 inet (eth0)  /  daily

    day         rx      |     tx      |  total
------------------------+-------------+----------------------------------------
   03.11.     26.57 MB  |   27.39 MB  |   53.97 MB   %%%%%%:::::::
   04.11.     22.23 MB  |   16.71 MB  |   38.94 MB   %%%%%::::
   05.11.     31.38 MB  |   23.35 MB  |   54.74 MB   %%%%%%%::::::
   06.11.     35.17 MB  |   26.85 MB  |   62.02 MB   %%%%%%%%%::::::
   07.11.     42.65 MB  |   34.19 MB  |   76.84 MB   %%%%%%%%%%%::::::::
   08.11.     36.65 MB  |   26.75 MB  |   63.40 MB   %%%%%%%%%::::::
   09.11.     35.01 MB  |   27.45 MB  |   62.47 MB   %%%%%%%%:::::::
   10.11.     24.48 MB  |   22.72 MB  |   47.20 MB   %%%%%%:::::
   11.11.     26.04 MB  |   19.91 MB  |   45.95 MB   %%%%%%:::::
   12.11.     27.89 MB  |   18.73 MB  |   46.61 MB   %%%%%%%::::
   13.11.     33.82 MB  |   24.52 MB  |   58.35 MB   %%%%%%%%::::::
   14.11.     39.11 MB  |   31.76 MB  |   70.86 MB   %%%%%%%%%::::::::
   15.11.     41.57 MB  |   36.23 MB  |   77.80 MB   %%%%%%%%%%:::::::::
   16.11.     36.93 MB  |   33.51 MB  |   70.44 MB   %%%%%%%%%::::::::
   17.11.     25.79 MB  |   23.87 MB  |   49.66 MB   %%%%%%::::::
   18.11.     29.51 MB  |   22.50 MB  |   52.01 MB   %%%%%%%::::::
   19.11.     43.46 MB  |   32.91 MB  |   76.38 MB   %%%%%%%%%%%::::::::
   20.11.     51.90 MB  |   47.82 MB  |   99.72 MB   %%%%%%%%%%%%%::::::::::::
   21.11.     38.77 MB  |   34.21 MB  |   72.98 MB   %%%%%%%%%%::::::::
   22.11.     34.54 MB  |   31.22 MB  |   65.76 MB   %%%%%%%%::::::::
   23.11.     22.61 MB  |   21.16 MB  |   43.76 MB   %%%%%:::::
   24.11.     22.49 MB  |   20.84 MB  |   43.34 MB   %%%%%:::::
   25.11.     31.60 MB  |   26.50 MB  |   58.10 MB   %%%%%%%%::::::
   26.11.     38.23 MB  |   33.84 MB  |   72.07 MB   %%%%%%%%%%::::::::
   27.11.     43.54 MB  |   41.88 MB  |   85.42 MB   %%%%%%%%%%%::::::::::
   28.11.     38.86 MB  |   30.87 MB  |   69.73 MB   %%%%%%%%%::::::::
   29.11.     40.16 MB  |   33.64 MB  |   73.79 MB   %%%%%%%%%%::::::::
   30.11.     32.73 MB  |   28.67 MB  |   61.40 MB   %%%%%%%%:::::::
   01.12.     23.35 MB  |   20.25 MB  |   43.60 MB   %%%%%:::::
   02.12.     27.27 MB  |   21.21 MB  |   48.47 MB   %%%%%%%:::::
------------------------+-------------+----------------------------------------
 estimated       29 MB  |      22 MB  |      51 MB
$ vnstat -m

 inet (eth0)  /  monthly

   month         rx      |      tx      |   total
-------------------------+--------------+--------------------------------------
  Jan '07       1.33 GB  |     1.25 GB  |     2.58 GB   %%%%%%%%%::::::::
  Feb '07       1.31 GB  |     1.51 GB  |     2.82 GB   %%%%%%%%%::::::::::
  Mar '07       1.54 GB  |     1.66 GB  |     3.20 GB   %%%%%%%%%%%:::::::::::
  Apr '07       1.27 GB  |     1.13 GB  |     2.40 GB   %%%%%%%%::::::::
  May '07       1.17 GB  |     1.31 GB  |     2.48 GB   %%%%%%%%:::::::::
  Jun '07     920.61 MB  |     2.00 GB  |     2.90 GB   %%%%%%:::::::::::::
  Jul '07     917.21 MB  |   763.12 MB  |     1.64 GB   %%%%%%:::::
  Aug '07     915.59 MB  |   905.99 MB  |     1.78 GB   %%%%%%::::::
  Sep '07     926.10 MB  |   678.70 MB  |     1.57 GB   %%%%%%::::
  Oct '07       1.00 GB  |   714.00 MB  |     1.69 GB   %%%%%%:::::
  Nov '07       0.99 GB  |   842.16 MB  |     1.81 GB   %%%%%%%:::::
  Dec '07      50.62 MB  |    41.46 MB  |    92.07 MB
-------------------------+--------------+--------------------------------------
estimated        808 MB  |      663 MB  |     1.44 GB
$ vnstat -t

 inet (eth0)  /  top 10

   #       day         rx      |     tx      |  total
-------------------------------+-------------+---------------------------------
   1    26.03.06      6.41 GB  |   10.83 GB  |   17.24 GB   %%%%%%%:::::::::::
   2    05.02.04      8.31 GB  |    7.08 GB  |   15.39 GB   %%%%%%%%%:::::::
   3    04.02.05      7.96 GB  |    6.21 GB  |   14.17 GB   %%%%%%%%::::::
   4    04.09.05      8.09 GB  |    5.22 GB  |   13.30 GB   %%%%%%%%:::::
   5    04.11.03      4.52 GB  |    5.96 GB  |   10.47 GB   %%%%::::::
   6    26.06.05      4.12 GB  |    6.10 GB  |   10.22 GB   %%%%::::::
   7    02.11.03      7.18 GB  |    2.79 GB  |    9.97 GB   %%%%%%%:::
   8    31.01.05      3.68 GB  |    5.99 GB  |    9.66 GB   %%%%::::::
   9    28.08.03      5.93 GB  |    3.69 GB  |    9.62 GB   %%%%%%::::
  10    23.12.03      4.36 GB  |    5.23 GB  |    9.59 GB   %%%%%:::::
-------------------------------+-------------+---------------------------------
$ vnstat -w

	Local (eth0)  /  weekly

	                    rx      |       tx      |    total
	----------------------------+---------------+--------------
	  last 7 days      4.83 GB  |     18.82 GB  |     23.65 GB
	    last week      2.52 GB  |     14.58 GB  |     17.10 GB
	 current week      2.31 GB  |      4.24 GB  |      6.55 GB
	----------------------------+---------------+--------------
	    estimated     17.66 GB  |     32.36 GB  |     50.02 GB
$ vnstat -tr
10386 packets sampled in 5 seconds
Traffic average for eth1

      rx         112.21 kB/s            620 packets/s
      tx        1444.77 kB/s           1456 packets/s
$ vnstat -l
Monitoring eth0...    (press CTRL-C to stop)

   rx:     430.68 kB/s   291 p/s            tx:      10.21 kB/s   147 p/s

 eth0  /  traffic statistics

                             rx       |       tx
--------------------------------------+----------------------------------------
  bytes                     32.79 MB  |        957 kB
--------------------------------------+----------------------------------------
          max            656.39 kB/s  |    90.50 kB/s
      average            419.78 kB/s  |    11.97 kB/s
          min            288.37 kB/s  |     7.03 kB/s
--------------------------------------+----------------------------------------
  packets                      23298  |         12348
--------------------------------------+----------------------------------------
          max                732 p/s  |       609 p/s
      average                291 p/s  |       154 p/s
          min                195 p/s  |       100 p/s
--------------------------------------+----------------------------------------
  time                  1.33 minutes

Posted in linux 维护优化, 技术.

Tagged with , .


使用iftop实时监控网卡流量

iftop是类似于top的实时流量监控工具,无报表功能,需使用root运行。

官方网站http://www.ex-parrot.com/~pdw/iftop/
目前最新版本为: iftop-0.17pre3.tar.gz
安装需要:
libpcap和libcurses

用yum或手动编译
yum install libpcap-devel

安装libpcap时出错
http://www.tcpdump.org/
gcc -O2 -I.  -DHAVE_CONFIG_H  -D_U_=”__attribute__((unused))” -c ./fad-getad.c
In file included from ./fad-getad.c:64:
/usr/include/linux/if_packet.h:52: 错误:expected specifier-qualifier-list before ‘__u32’
make: *** [fad-getad.o] 错误 1


#include <linux/types.h>
加入到
/usr/include/linux/if_packet.h
make,make install,通过!

iftop界面:
v0.12 screenshot 

iftop界面说明
第一行为带宽,这里为1Mbit,不是字节哦.
连接列表,最后三个分别是2秒,10秒和40秒的平均流量
=>代表发送,<= 代表接收
最后三行表示发送,接收和全部的流量,第二列为你运行iftop到目前流量,第三列为高峰值,第四列为平均值。

iftop命令说明
iftop: display bandwidth usage on an interface by host
 
Synopsis: iftop -h | [-npbBP] [-i interface] [-f filter code] [-N net/mask]
 
   -h                  display this message
   -n                  don’t do hostname lookups(不进行dns解析)
   -N                  don’t convert port numbers to services (直接显示端口号,不显示服务名称)
   -p                  run in promiscuous mode (show traffic between other
                       hosts on the same network segment)(嗅探器)
   -b                  don’t display a bar graph of traffic
   -B                  Display bandwidth in bytes (以字节统计)
   -i interface        listen on named interface
   -f filter code      use filter code to select packets to count
                       (default: none, but only IP packets are counted)
   -F net/mask         show traffic flows in/out of network
   -P                  show ports as well as hosts(按照端口对应ip地址)
   -m limit            sets the upper limit for the bandwidth scale
   -c config file      specifies an alternative configuration file
 
iftop, version 0.17pre3
copyright (c) 2002 Paul Warren <[email protected]> and contributors

iftop安装
wget http://www.ex-parrot.com/~pdw/iftop/download/iftop-0.17pre3.tar.gz
tar zxvf iftop-0.17pre3.tar.gz
cd iftop-0.17pre3
./configure
make
make install
iftop

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

              12.5Kb        25.0Kb        37.5Kb        50.0Kb  62.5Kb
mqqqqqqqqqqqqqvqqqqqqqqqqqqqvqqqqqqqqqqqqqvqqqqqqqqqqqqqvqqqqqqqqqqqqq
192.168.54.96         => 192.168.54.83         1.00Kb  1.86Kb  2.42Kb
                      <=                        160b    518b    485b
192.168.54.96         => 202.96.209.5             0b      0b     95b
                      <=                          0b      0b    168b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq
TX:             cumm:  3.77KB   peak: rates:Kb 1.00Kb  1.86Kb  2.51Kb
RX:                     980B            1.31Kb  160b    518b    653b
TOTAL:                 4.73KB           7.10Kb 1.16Kb  2.36Kb  3.15Kb

Posted in linux 维护优化, 技术.

Tagged with , .


使用nginx负载均衡lucene

server a是之前退役的,现存放着一些小些php站点和lucene 搜索,
server a
cpu: Xeon(TM) CPU 2.80GHz (双核*2)
mem:1G*2
disk:scsi 74G *2 (raid 0)
os:as4
app:nginx+php+fcgi+xcache+mysql+tomcat+postfix

server b为刚退役,没有站点。
server b
cpu: Xeon(TM) CPU 2.80GHz (双核*2)
mem:1G*2
disk: sata 80G *1 (7200)
os:as4
app:nginx+tomcat

—————————————
server a 的搜索每天有几十万PV,平均load 5,更新索引达30,高峰时tomcat会挂掉。
产品结构:nginx代理tomcat,jsp提供搜索结果,jsp+mysql记录搜索关键字,crontab定时生成索引。

方案一:server a 提供生成索引和mysql服务,server b 提供纯web搜索服务,用rsync同步索引文件。
方案二:server a 提供生成索引和mysql服务,server b 和server a使用负载均衡一起提供需web搜索服务,用rsync同步索引文件。

一。先设置两台服务器时间是同步的。

Linux的时间设置与同步 (NTP)

二。设置rsync时不需要登录。
用server b 去拉server a的索引
使用crontab+ssh每天自动完全备份mysql数据

三。写更新的bash和设置crontab
rsync在第一次是全部同步,以后就是只更新有异动的文件。
目前索引为1G左右,
cache使用三级目录分布小文件,占4G

在server b上
vi rsync_index.sh
#!/bin/bash
#获取lucene索引
/usr/bin/rsync -avlR –delete -e /usr/bin/ssh [email protected]:/lucene/index / >> /opt/shell/rsync_index.log

vi rsync_cache.sh
#!/bin/bash
#获取职位的cache和关键词
/usr/bin/rsync -avlR –delete -e /usr/bin/ssh [email protected]:/lucene/keyword / >> /opt/shell/rsync_keyword.log
/usr/bin/rsync -avlR –delete -e /usr/bin/ssh [email protected]:/lucene/cache / >> /opt/shell/rsync_cache.log

crontab每小时更新一次。
50 * * * * /bin/sh /opt/shell/rsync_cache.sh > /dev/null 2>&1
52 * * * * /bin/sh /opt/shell/rsync_index.sh > /dev/null 2>&1

四。设置nginx
设置nginx的配置文件,使用方案一

      location / {
           proxy_pass http://127.0.0.1:8080;
       location ~* ^.+\.(jpg|jpeg|gif|png|css|js)$ {
    root /opt/tomcat/webapps/search;
    access_log   off;
    expires 3d;
    break;
       }
      }           

重启nginx,将域名指向server b.
server b平均load 为5,当rsync更新时load 会达到20,还是不可靠,使用方案二。

     upstream mysvr {
 #ip_hash; (据说可以以C类IP将用户固定在某台server,开启后并发大降不能肯定是否有bug)
 server 127.0.0.1:8080;
 server 221.0.0.1:8080;
     }

server {
      …..

      location / {
           #proxy_pass http://127.0.0.1:8080;
    proxy_pass http://mysvr;
       location ~* ^.+\.(jpg|jpeg|gif|png|css|js)$ {
    root /opt/tomcat/webapps/search;
    access_log   off;
    expires 3d;
    break;
       }
      }           

      …….

}

重启nginx,将域名指向server b.
server b 和server 平均load 为1~2,更新会到5,还可以接受。

Posted in Nginx, Tomcat.

Tagged with , , , .


设置tomcat用jsvc启动

 

根据tomcat官方的document说明,linux下设置开机自启动可以使用jsvc(tomcat包里自带)
设置tomcat以独立的用户运行(防止以root运行,权限太大)

shell>sudo useradd -d /opt/tomcat -s /usr/sbin/nologin tomcat
上边的这个命令是添加一个系统用户tomcat,并且设置为不可登录系统。
设置用户tomcat 对tomcat6的访问权限

shell>sudo chown -R tomcat:website /opt/tomcat
安装jsvc,前提需要系统安装了gcc(系统一般默认安装),autoconf,libc6-dev

解压jsvc.tar.g
shell>cd /opt/tomcat/bin
shell>sudo tar zxvf jsvc.tar.gz
准备编译配置文件
shell>cd jsvc-src
shell>sudo sh support/buildconf.sh
如果成功,命令终端会打出:
support/buildconf.sh: configure script generated successfully
为configure添加执行权限
shell>sudo chmod 755 configure
编译
shell>sudo ./configure –with-java=/usr/java/jdk1.6.0_10(java的安装路径)
shell>sudo make
如果没有出现错误,jsvc就安装成功了。
设置启动脚本
修改/opt/tomcat/bin/jsvc-src/native/Tomcat5.sh 文件

# Adapt the following lines to your configuration
JAVA_HOME=/usr/java/jdk1.6.0_10
CATALINA_HOME=/opt/tomcat
DAEMON_HOME=/opt/tomcat/bin
TOMCAT_USER=tomcat

# for multi instances adapt those lines.
TMP_DIR=/var/tmp
PID_FILE=/var/run/jsvc.pid
CATALINA_BASE=/opt/tomcat

CATALINA_OPTS=””
CLASSPATH=\
$JAVA_HOME/lib/tools.jar:\
$CATALINA_HOME/bin/commons-daemon.jar:\
$CATALINA_HOME/bin/bootstrap.jar
case “$1” in
  start)
    #
    # Start Tomcat
    #
    $DAEMON_HOME/jsvc-src/jsvc \
    -user $TOMCAT_USER \
    -home $JAVA_HOME \
    -Dcatalina.home=$CATALINA_HOME \
    -Dcatalina.base=$CATALINA_BASE \
    -Djava.io.tmpdir=$TMP_DIR \
    -wait 10 \
    -pidfile $PID_FILE \
    -outfile $CATALINA_HOME/logs/catalina.out \
    -errfile ‘&1’ \
    $CATALINA_OPTS \
    -cp $CLASSPATH \
    org.apache.catalina.startup.Bootstrap
    #
    # To get a verbose JVM
    #-verbose \
    # To get a debug of jsvc.
    #-debug \
    exit $?
    ;;

  stop)
    #
    # Stop Tomcat
    #
    $DAEMON_HOME/jsvc-src/jsvc \
    -stop \
    -pidfile $PID_FILE \
    org.apache.catalina.startup.Bootstrap
    exit $?
    ;;

  *)
    echo “Usage tomcat.sh start/stop”
    exit 1;;
esac

拷贝jsvc带的tomcat5.sh 脚本拷贝到 /etc/init.d/ 下,并改名为tomcat
shell>sudo cp /opt/tomcat/bin/jsvc-src/native/Tomcat5.sh /etc/init.d/tomcat

 

设置 /etc/init.d/tomcat的可执行权限

Shell>sudo chmod 755 /etc/init.d/tomcat
在/etc/rc2.d/下设置一个/etc/init.d/tomcat 的软链接

shell>cd /etc/rc2.d/
shell>sudo ln -s /etc/init.d/tomcat S16tomcat

/etc/init.d/tomcat start 

ps aux|grep java
可以看到2个进程,一个是root,一个是tomcat 

 

 参考

http://wiki.ubuntu.org.cn/Tomcat6

Posted in Tomcat, 技术.

Tagged with .


优化tomcat 内存

编辑tomcatpath/bin/catalina.sh

在最前面加上下面两行

CATALINA_OPTS=’-Xms800m -Xmx1000m’
JAVA_OPTS=’-Xms800m -Xmx1000m’

表示初始化内存为800MB,可以使用的最大内存为1000MB

另外需要考虑的是Java提供的垃圾回收机制。虚拟机的堆大小决定了虚拟机花费在收集垃圾上的时间和频度。收集垃圾可以接受的速度与应用有关,应该通过分析实际的垃圾收集的时间和频率来调整。如果堆的大小很大,那么完全垃圾收集就会很慢,但是频度会降低。如果你把堆的大小和内存的需要一致,完全收集就很快,但是会更加频繁。调整堆大小的的目的是最小化垃圾收集的时间,以在特定的时间内最大化处理客户的请求。在基准测试的时候,为保证最好的性能,要把堆的大小设大,保证垃圾收集不在整个基准测试的过程中出现。

  如果系统花费很多的时间收集垃圾,请减小堆大小。一次完全的垃圾收集应该不超过 3-5 秒。如果垃圾收集成为瓶颈,那么需要指定代的大小,检查垃圾收集的详细输出,研究 垃圾收集参数对性能的影响。一般说来,你应该使用物理内存的 80% 作为堆大小。当增加处理器时,记得增加内存,因为分配可以并行进行,而垃圾收集不是并行的。

参考:
http://vod.sjtu.edu.cn/help/Article_Show.asp?ArticleID=1387&ArticlePage=1

Posted in Tomcat, 技术.

Tagged with , .