0%

防火墙

iptables 是建立在 netfilter 架构基础上的一个包过滤管理工具。
用户通过 /sbin/iptables 命令来管理 iptables,和 route 命令相同,iptables 命令的效果在重新启动以后就不再有效。

可以使用 /etc/rc.d/init.d/iptables save 将当前 iptables 规则写到 /etc/sysconfig/iptables 文件中,那么每次开机时/etc/rc.d/init.d/iptables start 命令会使 /etc/sysconfig/iptables 中的规则生效

iptables构成

iptables 是由几张表所组成,每张表又由几条链组成,每张表负责不同的封包处理机制,每条链负责不同的封包走向,具体采取的策略由链里的规则设定

  • filter 表: 用于过滤封包
    • INPUT 链: 存在于 filter 表,主要用于处理进入本机的封包
      • OUTPUT 链: 存在于 filter 表,主要用于处理离开本机的封包
      • FORWARD 链: 存在于 fileter 表,主要用于处理穿过本机的封包
  • Nat 表 : 用于做地址转换
    • PREROUTING 链: 存在于 nat 表,主要用于修改目的地址(DNAT)
    • POSTROUTING 链: 存在于 nat 表,主要用于修改来源地址(SNAT)
  • mangle 表: 允许改变包的内容来进一步矫正包
阅读全文 »

性能优化的步骤

一、发现问题(性能监控)

可能存在的问题:GC频繁、cpu load过高、OOM、内存泄漏、死锁、程序响应时间过长

二、排查问题(性能分析)

分析方式或工具

  • 打印GC日志,通过GCviewer或者http://gceasy.io来分析日志信息
  • 命令行工具,如jstack、jmap、jinfo等
  • dump出堆文件,使用内存分析工具分析文件
  • 使用阿里Arthas或jconsole、JVisualVM来实时查看JVM状态
  • jstack查看堆栈信息

三、解决问题(性能调优)

解决的大致方向如下

  • 适当增加内存,根据业务背景选择垃圾回收器
  • 优化代码,控制内存使用
  • 增加机器,分散节点压力
  • 合理设置线程池线程数量
  • 使用中间件提高程序效率,比如缓存,消息列队等

网卡设置

虚拟机每clone一次,网卡mac地址更新,centos自动新增一个eth网卡

1
2
3
4
5
6
7
# 删除网络设置
rm -f /etc/udev/rules.d/70-persistent-net.rules
#重启
reboot
#关闭服务NetworkManager
chkconfig NetworkManager off
service NetworkManager stop

修改eth0网卡信息 /etc/sysconfig/network-scripts/ifcfg-eth0

1
2
3
4
5
6
7
8
DEVICE=eth0 #网卡设备名称
ONBOOT=yes #启动时是否激活 yes|no
BOOTPROTO=static #协议类型 dhcp bootp none
IPADDR=192.168.134.136 #网络IP地址
NETMASK=255.255.255.0 #网络子网地址
GATEWAY= #网关地址
BROADCAST=192.168.134.255 #广播地址
TYPE=Ethernet #网卡类型为以太网

之后启动network服务

1
2
chkconfig network on
service network start

spring的扩展接口

spring提供了一些扩展接口来对spring进行定制化功能,可以选择如下一些扩展点:

BeanFactoryPostProcessor

beanFactory后置处理器,支持在bean factory标准初始化完成后,对bean factory进行一些额外处理。这时所有的bean的描述信息已经加载完毕,但是还没有进行bean初始化。如PropertyPlaceholderConfigurer,就是在这个扩展点上对bean属性中的占位符进行替换

阅读全文 »

字节码指令

字节码指令由一个操作码(一个字节长度、代表着特殊含义的数字)以及操作码之后有零个至多个代表此操作所需参数构成

分为九类指令

  • 加载与存储指令
  • 算术指令
  • 类型转换指令
  • 对象的创建与访问指令
  • 方法调用与返回指令
  • 操作数栈管理指令
  • 比较控制指令
  • 异常处理指令
  • 同步控制指令
阅读全文 »

MVCC机制

使用MVCC(Multi-Version Concurrency Control,多版本的并发控制协议)机制来实现可重复读(REPEATABLE READ)的隔离级别

MVCC最大的优点是读不加锁,因此读写不冲突,并发性能好。InnoDB实现MVCC,多个版本的数据可以共存,主要是依靠数据的隐藏列(也可以称之为标记位)和undo log。其中数据的隐藏列包括了该行数据的版本号、删除时间、指向undo log的指针等等;在进行数据修改时,当前记录会进行加锁,把修改前的数据放入undo log中,通过undo log的指针与数据进行关联,如果修改失败,则恢复undo log中的数据

MySQL的隐藏列

innodb每个聚集索引都有4个隐藏字段,分别为主键(RowId),最近更改的事务ID、undo log的指针、索引删除标记(数据被删除时,并不是立即删除,而是打上删除标记,进行异步删除)

zookeeper的API

首先引入zookeeper依赖

1
2
3
4
5
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.6.1</version>
</dependency>
阅读全文 »

获取request

有时候需要在处理业务的时候用到request对象,可以使用该方法获取

1
HttpServletRequest request = ((ServletRequestAttributes) (RequestContextHolder.currentRequestAttributes())).getRequest();

使用RequestContextHolder.currentRequestAttributes()获取的RequestAttributes对象是线程局部变量(ThreadLocal),request对象也是线程局部变量

session共享配置

在server.xml中进行配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="8">
<Manager className="org.apache.catalina.ha.session.DeltaManager" expireSessionsOnShutdown="false" otifyListenersOnReplication="true"/>
<Channel className="org.apache.catalina.tribes.group.GroupChannel">
<Membership className="org.apache.catalina.tribes.membership.McastService"
address="192.168.1.3" port="45564" frequency="500" dropTime="3000"/>
<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
address="auto" port="4000" autoBind="100" selectorTimeout="5000" maxThreads="6"/>

<Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
<Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
</Sender>

<Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>

</Channel>

<Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
filter=""/>

<Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>

<Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
tempDir="/tmp/war-temp/" deployDir="/tmp/war-deploy/" watchDir="/tmp/war-listen/" watchEnabled="false"/>

<ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>

</Cluster>