Archive for the 'SysAdmin' Category

Page 2 of 4

使用Cacti监控JVM

Cacti官方论坛里有几个监控JVM的模板:

导入到Cacti后,需要启用JVM的SNMP Agent,方法如下:
1. 启动JVM的参数里加入-Dcom.sun.management.snmp.port=9998 这个是指定SNMP Agent的监听端口。
2. 设置访问权限

$ sudo cp $JRE_HOME/lib/management/snmp.acl.template $JRE_HOME/lib/management/snmp.acl
$ sudo vi $JRE_HOME/lib/management/snmp.acl

acl = {
  {
    communities = public, private
    access = read-only
    managers = localhost
  }
}

trap = {
  {
    trap-community = public
    hosts = localhost
  }
}

3. 设置配置文件的权限,必须只能为启用JVM的用户只读,否则不能工作。(management.properties不用修改,使用默认配置即可)

$ sudo chmod 600 management.properties snmp.acl
$ sudo chown jetty management.properties snmp.acl

4. 重启JVM,用netstat命令检查9998端口是否已被监听或用snmpwalk命令检查。

$ sudo netstat -tlunp |grep 9998
$ snmpwalk -v 2c -c public localhost:9998 .1.3.6.1.4.1.42

5. 为了让远程的Cacti主机可以访问,可使用snmpd的proxy功能将请求转发到localhost的JVM SNMP Agent上。修改snmpd的配置文件,添加
proxy -v 2c -c public localhost:9998 .1.3.6.1.4.1.42
然后重启snmpd服务。在Cacti主机上以snmpwalk命令检查,应该能得到与上一步中snmpwalk命令一样的输出。snmpwalk -v 2c -c public remotehost .1.3.6.1.4.1.42
6. 至此,可以在Cacti里为JVM主机添加监控图表了,注意Device的SNMP Options配置里SNMP Version要选择Version 2。

参考:

再次遭遇大量CLOSE_WAIT

今天下午线上的Jetty服务又停止响应了。不过与上次不同的是,日志里没有Too many open files的问题(看来ulimit设置管用了),看不出任何问题。于是用netstat检查网络连接,发现了大量CLOSE_WAIT状态的连接,而且都是连接到同一个IP地址。联想到程序里有调用外部网站服务的部分,检查这个IP,正是其中的一个服务。检查代码,发现开发人员使用Commons HttpClient时出了问题,居然忘记关闭连接了(method.releaseConnection();)!!后果就是对方关闭了连接,连接不断地变成CLOSE_WAIT状态,直到耗尽所有的网络资源,没法再建立连接了。

从这个教训看出,项目的研发管理真是没有到位啊!快速反复的需求、几乎可以忽略的设计、缺少代码走查、没有单元测试,怎能保证上线前发现这样的问题!

遭遇”java.io.IOException: Too many open files”

今天下午,线上的Jetty服务宕机了,日志里大量的”java.io.IOException: Too many open files”错误。搜索到Freddy Chu的博客里正好有关于此的解决办法。

$ sysctl fs.file-max
$ lsof -u jetty -nn | wc -l
$ ulimit -a
$ sudo vi /etc/security/limits.conf
* soft nofile 65535
* hard nofile 65535

同时发现了系统里也有Freddy Chu提到的”Too many CLOSE_WAIT”问题,谢谢Freddy Chu。

$ sudo vi /etc/sysctl.conf
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_intvl = 2
net.ipv4.tcp_keepalive_probes = 2
net.ipv4.tcp_keepalive_time = 1800

$ sudo sysctl -p

Update(2010-01-21): root用户要特殊设置

$ sudo vi /etc/security/limits.conf
root soft nofile 65535
root hard nofile 65535

npc安装问题解决一例

CactiNagios都是好用的运维监控软件,NPC(Nagios Plugin for Cacti)是一个Cacti插件,安装后可以在Cacti界面里使用Nagios的功能。官方安装文档在这里

我的安装环境是这样的:

PHP必须安装PDO 和 JSON扩展。由于NPC使用了Ext JS,如果没有JSON扩展,NPC的界面不会出来,只能看到一个空白页面。Ubuntu 6.06下安装PDO可以参考这里

按照官方文档安装配置好后,遇到了没有显示任何数据的问题,host, hostgroup, service, servicegroup等等都看不到。

检查了NPC的数据库表,有数据,说明NDOUtils已经工作。没有出现在界面上,说明是NPC从数据库读出来到界面显示过程中出现的问题。

用Firebug找出NPC界面为了获取显示数据的Ajax请求(比如/cacti/plugins/npc/npc.php?module=servicegroups&action=getHostStatusPortlet),直接在浏览器里访问,可以看到出了异常:Fatal error: Uncaught exception ‘Doctrine_Exception’ with message ‘Couldn’t find class NpcServicegroups’ 。显然是Doctrine没有加载到NPC定义的领域类。

经过一番对Doctrine的调试,发现原因在Doctrine类的loadModels方法(Line 516 in Doctrine.php)

$e = explode('.', $file->getFileName());

这里getFileName返回了带绝对路径的文件名,导致autoload函数失败。改成下面这样就解决了。

$e = explode('.', basename($file->getFileName()));

不过还是不明白为什么getFileName返回的是带绝对路径的文件名,是跟我的系统环境有关系吗?有熟悉PHP的朋友能解释一下就好了。

How to install Nginx from source with ‘Debian’ layout

1. 创建相关目录

$ sudo mkdir /etc/nginx
$ sudo mkdir /etc/nginx/conf.d
$ sudo mkdir /etc/nginx/sites-available
$ sudo mkdir /etc/nginx/sites-enabled
$ sudo mkdir /var/log/nginx
$ sudo mkdir -p /var/lib/nginx/body
$ sudo mkdir /var/lib/nginx/proxy
$ sudo mkdir /var/lib/nginx/fastcgi

2. 编译安装

$ ./configure --prefix=/usr \
--sbin-path=/usr/sbin/nginx \
--conf-path=/etc/nginx/nginx.conf \
--lock-path=/var/lock/nginx.lock \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--pid-path=/var/run/nginx.pid \
--user=www-data \
--group=www-data \
--http-client-body-temp-path=/var/lib/nginx/body \
--http-proxy-temp-path=/var/lib/nginx/proxy \
--http-fastcgi-temp-path=/var/lib/nginx/fastcgi \
--with-md5=/usr/lib \
--with-sha1=/usr/lib \
--with-http_ssl_module \
--with-http_gzip_static_module \
--with-pcre \
--without-mail_pop3_module \
--without-mail_imap_module \
--without-mail_smtp_module \
--with-http_stub_status_module

$ make
$ sudo make install
$ sudo mv /usr/html /var/www/nginx-default

3. 修改配置文件
/etc/nginx/nginx.conf

user www-data;
worker_processes  5;

error_log  /var/log/nginx/error.log;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    server_tokens off;
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    access_log  /var/log/nginx/access.log;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;
    tcp_nodelay        on;
    gzip  on;

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}

/etc/nginx/sites-available/default

server {
    listen       80;
    server_name  localhost;

    location / {
        root   /var/www/nginx-default;
        index  index.html index.htm;
    }


    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /var/www/nginx-default;
    }
}

启用default vhost

sudo ln -s /etc/nginx/sites-available/default /etc/nginx/sites-enabled/default

4. 创建init脚本
$ sudo vi /etc/init.d/nginx

#! /bin/sh

### BEGIN INIT INFO
# Provides:          nginx
# Required-Start:    $all
# Required-Stop:     $all
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: starts the nginx web server
# Description:       starts nginx using start-stop-daemon
### END INIT INFO

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DAEMON=/usr/sbin/nginx
NAME=nginx
DESC=nginx

test -x $DAEMON || exit 0

# Include nginx defaults if available
if [ -f /etc/default/nginx ] ; then
        . /etc/default/nginx
fi

set -e

. /lib/lsb/init-functions

case "$1" in
  start)
        echo -n "Starting $DESC: "
        start-stop-daemon --start --quiet --pidfile /var/run/$NAME.pid \
                --exec $DAEMON -- $DAEMON_OPTS || true
        echo "$NAME."
        ;;
  stop)
        echo -n "Stopping $DESC: "
        start-stop-daemon --stop --quiet --pidfile /var/run/$NAME.pid \
                --exec $DAEMON || true
        echo "$NAME."
        ;;
  restart|force-reload)
        echo -n "Restarting $DESC: "
        start-stop-daemon --stop --quiet --pidfile \
                /var/run/$NAME.pid --exec $DAEMON || true
        sleep 1
        start-stop-daemon --start --quiet --pidfile \
                /var/run/$NAME.pid --exec $DAEMON -- $DAEMON_OPTS || true
        echo "$NAME."
        ;;
  reload)
      echo -n "Reloading $DESC configuration: "
      start-stop-daemon --stop --signal HUP --quiet --pidfile /var/run/$NAME.pid \
          --exec $DAEMON || true
      echo "$NAME."
      ;;
  status)
      status_of_proc -p /var/run/$NAME.pid "$DAEMON" nginx && exit 0 || exit $?
      ;;
  *)
        N=/etc/init.d/$NAME
        echo "Usage: $N {start|stop|restart|reload|force-reload|status}" >&2
        exit 1
        ;;
esac

exit 0

$ sudo chmod +x /etc/init.d/nginx
$ sudo /usr/sbin/update-rc.d -f nginx defaults

5. 启动、停止、重启nginx服务

sudo /etc/init.d/nginx start
sudo /etc/init.d/nginx stop
sudo /etc/init.d/nginx restart




This work by wolfg is licensed under a Attribution-Noncommercial-Share Alike 2.5 China Mainland.