再谈使用Commons HttpClient产生大量CLOSE_WAIT

默认情况下(即用默认构造方法建立HttpClient对象),httpMethod.releaseConnection()方法并不会关闭连接的Socket,目的是可以重用这个连接。网上有不少讨论:

这些讨论里提出了关闭Socket的方法,即在请求头里加上"Connection: close",具体可见HTTP协议规范里的说明

其实HttpClient 3.x 里还可以通过下面的方式建立HttpClient对象,来保证关闭Socket连接:

HttpClient httpClient = new HttpClient(new SimpleHttpConnectionManager(true));

具体可见HttpClient源码和API文档。

当然,使用HttpClient的多线程连接管理器时就不用这么做了。

SSH:不用密码登录

用SSH登录远程主机,每次都输入密码挺麻烦的,其实可以用密钥文件来登录:
1. 用ssh-keygen命令生成private/public密钥对,提示问题都用默认回答即可。

$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/guoyong/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/guoyong/.ssh/id_rsa.
Your public key has been saved in /home/guoyong/.ssh/id_rsa.pub.

2. 用ssh-copy-id命令把公钥复制到远程主机上,user就是你登录用的用户名

$ ssh-cody-id user@remotehost

3. 验证一下吧

$ ssh user@remotehost echo "it works"

nrpe使用一例

NRPE的作用是在远程主机上运行Nagios插件,以便监控远程主机。

Ubuntu Server下安装NRPE很方便:

$ sudo apt-get install nagios-nrpe-server nagios-plugins

默认的几个检查命令(check_users, check_load等)都已经在/etc/naigos/nrpe.cfg和/etc/nagios/nrpe_local.cfg配置好了。在Nagios里配置监控服务使用类似如下的监控命令就可以了:

check_command check_nrpe!check_load

如果需要自定义监控命令,只需在/etc/nagios/nrpe_local.cfg里设置,重启NRPE服务,再在Nagios里配置监控服务即可。比如,要添加一个监控TCP各种状态的命令,步骤如下:

@remotehost
$ cd /usr/lib/nagios/plugins
$ sudo wget http://www.tuschy.com/nagios/plugins/check_tcp_count
$ sudo chmod +x check_tcp_count
$ cd /etc/nagios
$ sudo vi nrpe_local.cfg
command[check_tcp_count]=/usr/lib/nagios/plugins/check_tcp_count
$ sudo service nagios-nrpe-server restart

@nagioshost
$ sudo vi remotehost.cfg
define service{
use generic-service
host_name remotehostname
service_description Tcp count
check_command check_nrpe!check_tcp_count
}

使用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。

参考: