Tomcat 内存配置

Java | Posted by 老沙
7月 15 2017

设置Tomcat启动的初始内存其初始空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)是物理内存的1/4。

可以利用JVM提供的-Xmn -Xms -Xmx等选项可进行设置

三、实例,以下给出1G内存环境下Java jvm 的参数设置参考:

JAVA_OPTS=”-server -Xms800m -Xmx800m -XX:PermSize=64M -XX:MaxNewSize=256m -XX:MaxPermSize=128m -Djava.awt.headless=true ”

JAVA_OPTS=”-server -Xms768m -Xmx768m -XX:PermSize=128m -XX:MaxPermSize=256m -XX: NewSize=192m -XX:MaxNewSize=384m”

CATALINA_OPTS=”-server -Xms768m -Xmx768m -XX:PermSize=128m -XX:MaxPermSize=256m -XX:NewSize=192m -XX:MaxNewSize=384m”

Linux

在/usr/local/apache-tomcat-5.5.23/bin 目录下的catalina.sh添加:

JAVA_OPTS=’-Xms512m -Xmx1024m’要加“m”说明是MB,否则就是KB了,在启动tomcat时会 报内存不足。

-Xms:初始值-Xmx:最大值-Xmn:最小值

Windows

在catalina.bat最前面加入set JAVA_OPTS=-Xms128m -Xmx350m

如果用startup.bat启动tomcat,OK设置生效.够成功的分配200M内存.

但是如果不是执行startup.bat启动tomcat而是利用windows的系统服务启动tomcat服务,上面的设置就不生效了,就是说set JAVA_OPTS=-Xms128m -Xmx350m 没起作用.

JFinal 部署在tomcat下

Java | Posted by 老沙
7月 14 2017

环境配置就不说了,JFinal项目和java web项目本质上是一样的,所以部署方式也是相同的

1 进入/var/www目录,解WAR包,目录下会有WEB-INF,META-INF 等文件夹

2 修改  TOMCAT_HOME/conf/ server.xml 文件找到 Host 标记,在其中添加如下子标记:

<Context path=”” docBase=”/var/www” reloadable=”false” />

3 注意 Host 标记中的 appBase 属性不要去修改,让其为默认值 “webapps”

4 启动 tomcat

注意点:

1 不要把项目部署在TOMCAT_HOME/webapps 目录下,避免 tomcat 加载项目两次的坑,这个坑会引发一些莫名奇妙的问题,例如:老版本的tomcat中,多人同时登录后session产生混乱

2 以上配置中的 Context 标记的 path 属性一定要设置为 “” 而不是 “/”,否则也会跳入一个坑。 docBase 属性后面放项目名称的绝对地址

路由器温度测试语句 linux CPU占用率 100%

LINUX | Posted by 老沙
7月 13 2017

for i in `seq 1 $(cat /proc/cpuinfo |grep “processor” |wc -l)`; do dd if=/dev/zero of=/dev/
null & done

JAVA JDK API 1.8_EN 1.6_CN

Java | Posted by 老沙
7月 13 2017

Java8 API

JDK_API_1_6_zh_CN

mysql与JFinal的数据关系

Java | Posted by 老沙
7月 12 2017

MySQL与jfinal在使用过程中,一定要弄清楚数据关系,否则容易发生类型不匹配的错误。

一、关系整理

为此,我根据jfinal的源码和mysql的数据字段类型,整理列表如下:

mysql                                                                                                jfinal                  例子                      编号
varchar, char, enum, set, text, tinytext, mediumtext, longtext                          String          getStr(“xxx”)          0001
int, integer, tinyint(n) n > 1, smallint, mediumint                                                     int             getInt(“xxx”)    0002
bigint, unsign int                                                                                                             long getLong(“xxx”) 0003
unsigned bigint                                                                                                            BigInteger getBigInteger(“xxx”) 0004
date, year                                                                                                                       Date getDate(“xxx”) 0005
time                                                                                                                                 Time getTime(“xxx”) 0006
timestamp, datetime                                                                                                   Timestamp getTimestamp(“xxx”) 0006
real, double                                                                                                                   Double getDouble(“xxx”) 0007
float                                                                                                                                 Float getFloat(“xxx”) 0008
bit, tinyint(1)                                                                                                                 Boolean getBoolean(“xxx”) 0009
decimal, numeric                                                                                                         BigDecimal getBigDecimal(“xxx”) 0010
binary, varbinary, tinyblob, blob, mediumblob, longblob                                   byte[] getBytes(“xxx”) 0011
extends from Number                                                                                                 Number getNumber(“xxx”) 0012
二、tinyint

在mysql中,tinyint(n)中的n对jfinal的数据转换有影响:

n>1时,jfinal要使用getInt。
n=1时,jfinal要使用getBoolean。
三、unsigned

在mysql中unsigned表示有无符号,举例来说:

unsigned int,表示数据>0,不包含负数,那么jfinal就要使用getLong。
unsigned bigint,表示数据>0,不包含负数,那么jfinal就要使用getBigInteger。
四、int(m)

关于mysql中int(m)中的m,这当然包含bigint(m)的m。

int[(m)]
有符号值:-2147683648 到2147683647(- 231 到231- 1)
无符号值:0到4294967295(0 到232 – 1) 4个字节
这意味着,如果你的数据字段是这样子的话

`uid` int(11) NOT NULL DEFAULT ‘0’ COMMENT ‘用户id’
1
1
那么m=11是正确的,因为考虑到“-”(负数),长度最大为11位。

而如果你的数据字段是这样子的话

`uid` int(11) unsigned NOT NULL COMMENT ‘用户id’
1
1
那么m=11是没有意义的,因为最大长度为10位,如果你比较专业的话,此时,你的数据字段就应该是这样子的

`uid` int(10) unsigned NOT NULL COMMENT ‘用户id’
1
1
五、jfinal的api

只看如下代码:

/**
* Get attribute of mysql type: int, integer, tinyint(n) n > 1, smallint, mediumint
*/
public Integer getInt(String attr) {
return (Integer)attrs.get(attr);
}

/**
* Get attribute of mysql type: bigint, unsign int
*/
public Long getLong(String attr) {
return (Long)attrs.get(attr);
}
1
2
3
4
5
6
7
8
9
10
11
12
13

1
2
3
4
5
6
7
8
9
10
11
12
13
方法很详细的介绍了应该匹配哪一种mysql数据类型。

编译ESP8266固件

ESP8266/32 | Posted by 老沙
7月 01 2017

一、编译环境配置

我们先安装编译需要的软件包
sudo apt-get install git autoconf build-essential gperf bison flex texinfo libtool libncurses5-dev wget gawk libc6-dev-amd64 python-serial libexpat-dev

export PATH=”/opt/xtensa-lx106-elf/bin/:$PATH”

报错:

/opt/xtensa-lx106-elf/lib/gcc/xtensa-lx106-elf/4.8.2/include/sys/fcntl.h:31:34: fatal error: xtensa/simcall-fcntl.h: No such file or directory
#include <xtensa/simcall-fcntl.h>

cp -Rp ~/Share/ESP8266_RTOS_SDK/extra_include/xtensa ./

超级玛丽增强版VC源码 vc6.0

LINUX C & ARM & C51 | Posted by 老沙
6月 07 2017

超级玛丽增强版VC源码

Ramps-1.4.2-master 源代码

3D打印机 | Posted by 老沙
6月 07 2017

Ramps-1.4.2-master

ht1621 液晶屏 驱动

LINUX C & ARM & C51 | Posted by 老沙
6月 07 2017

没啥说的,一个驱动

ht1621驱动资料

利用 ipset 封禁大量 IP

LINUX | Posted by 老沙
4月 25 2017

利用 ipset 封禁大量 IP

使用 iptables 封 IP,是一种比较简单的应对网络攻击的方式,也算是比较常见。有时候可能会封禁成千上万个 IP,如果添加成千上万条规则,在一台注重性能的服务器或者本身性能就很差的设备上,这就是个问题了。ipset 就是为了避免这个问题而生的。

关于 iptables,要知道这两点。

  • iptables 包含几个表,每个表由链组成。默认的是 filter 表,最常用的也是 filter 表,另一个比较常用的是 nat 表。一般封 IP 就是在 filter 表的 INPUT 链添加规则。
  • 在进行规则匹配时,是从规则列表中从头到尾一条一条进行匹配。

这像是在链表中搜索指定节点费力。ipset 提供了把这个 O(n) 的操作变成 O(1) 的方法:就是把要处理的 IP 放进一个集合,对这个集合设置一条 iptables 规则。像 iptable 一样,IP sets 是 Linux 内核中的东西,ipset 这个命令是对它进行操作的一个工具。

简单的流程

可以用这几条命令概括使用 ipset 和 iptables 进行 IP 封禁的流程

ipset create vader hash:ip  
iptables -I INPUT -m set --match-set vader src -j DROP  
ipset add vader 4.5.6.7  
ipset add vader 1.2.3.4  
ipset add vader ...  
ipset list vader # 查看 vader 集合的内容  

下面分别对各条命令进行描述。

创建一个集合

ipset create vader hash:ip  

这条命令创建了名为 vader 的集合,以 hash 方式存储,存储内容是 IP 地址。

添加 iptables 规则

iptables -I INPUT -m set --match-set vader src -j DROP  

如果源地址(src)属于 vader 这个集合,就进行 DROP 操作。这条命令中,vader 是作为黑名单的,如果要把某个集合作为白名单,添加一个 ‘!’ 符号就可以。

iptables -I INPUT -m set ! --match-set yoda src -j DROP  

到现在虽然创建了集合,添加了过滤规则,但是现在集合还是空的,需要往集合里加内容。

找出“坏” IP

找出要封禁的 IP,这是封禁过程中重要的步骤,不过不是这里的重点。简要说明一下两种方法思路。

netstat -ntu | tail -n +3 | awk '{print $5}' | sort | uniq -c | sort -nr  

直接通过 netstat 的信息,把与本地相关的各种状态的 IP 都计数,排序列出来。

或者从 nginx 或者其他 web server 的日志里找请求数太多的 IP

awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr  

后半部分,排序,去重,再按次数进行逆向排序的操作,跟上面命令是一样的。

找出“坏” IP,往之前创建的集合里添加就可以了。

ipset add vader 4.5.6.7  

有多少“坏” IP,就添加多少 IP,因为针对这些封禁的 IP 只需要一条 iptables 规则,而这些 IP 是以 hash 方式存储,所以封禁大量的 IP 也不会影响性能,这也是 ipset 存在的最大目的。

 

ipset 更多的用法

存储类型

前面例子中的 vader 这个集合是以 hash 方式存储 IP 地址,也就是以 IP 地址为 hash 的键。除了 IP 地址,还可以是网络段,端口号(支持指定 TCP/UDP 协议),mac 地址,网络接口名称,或者上述各种类型的组合。

比如指定 hash:ip,port就是 IP 地址和端口号共同作为 hash 的键。查看 ipset 的帮助文档可以看到它支持的所有类型。

下面以两个例子说明。

hash:net

ipset create r2d2 hash:net  
ipset add r2d2 1.2.3.0/24  
ipset add r2d2 1.2.3.0/30 nomatch  
ipset add r2d2 6.7.8.9  
ipset test r2d2 1.2.3.2  

hash:net 指定了可以往 r2d2 这个集合里添加 IP 段或 IP 地址。

第三条命令里的 nomatch 的作用简单来说是把 1.2.3.0/301.2.3.0/24 这一范围相对更大的段里“剥离”了出来,也就是说执行完 ipset add r2d2 1.2.3.0/24 只后1.2.3.0/24 这一段 IP 是属于 r2d2 集合的,执行了 ipset add r2d2 1.2.3.0/30 nomatch 之后,1.2.3.0/24 里 1.2.3.0/30 这部分,就不属于 r2d2 集合了。执行 ipset test r2d2 1.2.3.2 就会得到结果 1.2.3.2 is NOT in set r2d2.

hash:ip,port

ipset create c-3po hash:ip,port  
ipset add c-3po 3.4.5.6,80  
ipset add c-3po 5.6.7.8,udp:53  
ipset add c-3po 1.2.3.4,80-86  

第二条命令添加的是 IP 地址为 3.4.5.6,端口号是 80 的项。没有注明协议,默认就是 TCP,下面一条命令则是指明了是 UDP 的 53 端口。最后一条命令指明了一个 IP 地址和一个端口号范围,这也是合法的命令。

自动过期,解封

ipset 支持 timeout 参数,这就意味着,如果一个集合是作为黑名单使用,通过 timeout 参数,就可以到期自动从黑名单里删除内容。

ipset create obiwan hash:ip timeout 300  
ipset add obiwan 1.2.3.4  
ipset add obiwan 6.6.6.6 timeout 60  

上面第一条命令创建了名为 obiwan 的集合,后面多加了 timeout 参数,值为 300,往集合里添加条目的默认 timeout 时间就是 300。第三条命令在向集合添加 IP 时指定了一个不同于默认值的 timeout 值 60,那么这一条就会在 60 秒后自动删除。

隔几秒执行一次 ipset list obiwan 可以看到这个集合里条目的 timeout 一直在随着时间变化,标志着它们在多少秒之后会被删除。

如果要重新为某个条目指定 timeout 参数,要使用 -exit 这一选项。

ipset -exist add obiwan 1.2.3.4 timeout 100  

这样 1.2.3.4 这一条数据的 timeout 值就变成了 100,如果这里设置 300,那么它的 timeout,也就是存活时间又重新变成 300。

如果在创建集合是没有指定 timeout,那么之后添加条目也就不支持 timeout 参数,执行 add 会收到报错。想要默认条目不会过期(自动删除),又需要添加某些条目时加上 timeout 参数,可以在创建集合时指定 timeout 为 0。

ipset create luke hash:ip  
ipset add luke 5.5.5.5 timeout 100  
# 得到报错信息 kernel error received: Unknown error -1

更大!

hashsize, maxelem 这两个参数分别指定了创建集合时初始的 hash 大小,和最大存储的条目数量。

ipset create yoda hash:ip,port hashsize 4096 maxelem 1000000  
ipset add yoda 3.4.5.6,3306  

这样创建了名为 yoda 的集合,初始 hash 大小是 4096,如果满了,这个 hash 会自动扩容为之前的两倍。最大能存储的数量是 100000 个。

如果没有指定,hashsize 的默认值是 1024,maxelem 的默认值是 65536。

另外几条常用命令

ipset del yoda x.x.x.x    # 从 yoda 集合中删除内容  
ipset list yoda           # 查看 yoda 集合内容  
ipset list                # 查看所有集合的内容  
ipset flush yoda          # 清空 yoda 集合  
ipset flush               # 清空所有集合  
ipset destroy yoda        # 销毁 yoda 集合  
ipset destroy             # 销毁所有集合  
ipset save yoda           # 输出 yoda 集合内容到标准输出  
ipset save                # 输出所有集合内容到标准输出  
ipset restore             # 根据输入内容恢复集合内容  

还有……

  • 如果创建集合是指定的存储内容包含 ip, 例如 hash:iphash:ip,port ,在添加条目时,可以填 IP 段,但是仍然是以单独一个个 IP 的方式来存。
  • 上面所有的例子都是用 hash 的方式进行存储,实际上 ipset 还可以以 bitmap 或者 link 方式存储,用这两种方式创建的集合大小,是固定的。
  • 通过 man upsetipset —help 可以查到更多的内容,包括各种选项,支持的类型等等。