NIO学习笔记

NIO最重要的3个概念

  • Channel 通道
  • Buffer 缓冲区
  • Selector 选择器

原理

其中Channel对应以前的流,Buffer不是什么新东西,Selector是因为nio可以使用异步的非堵塞模式才加入的东西。

以前的流总是堵塞的,一个线程只要对它进行操作,其它操作就会被堵塞,也就相当于水管没有阀门,你伸手接水的时候,

不管水到了没有,你就都只能耗在接水(流)上。

nio的Channel的加入,相当于增加了水龙头(有阀门),虽然一个时刻也只能接一个水管的水,但依赖轮换策略,在水量

不大的时候,各个水管里流出来的水,都可以得到妥善接纳,这个关键之处就是增加了一个接水工,也就是Selector,他负

责协调,也就是看哪根水管有水了的话,在当前水管的水接到一定程度的时候,就切换一下:临时关上当前水龙头,试着打开

另一个水龙头(看看有没有水)。

当其他人需要用水的时候,不是直接去接水,而是事前提了一个水桶给接水工,这个水桶就是Buffer。也就是,其他人虽然也

可能要等,但不会在现场等,而是回家等,可以做其它事去,水接满了,接水工会通知他们。

这其实也是非常接近当前社会分工细化的现实,也是统分利用现有资源达到并发效果的一种很经济的手段,而不是动不动就来个

并行处理,虽然那样是最简单的,但也是最浪费资源的方式。

ubuntu安装java8+tomcat8

安装java8

从官网下载tar包到机器上

解压tar包到/usr/local目录下

1
tar xvf jdk-8u121-linux-x64.tar.gz -C /usr/local

设置环境变量

/etc/profile文件, 添加如下内容

1
2
3
4
export JAVA_HOME=/usr/local/jdk1.8.0_121
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH:

执行source /etc/profile

安装tomcat8

从官网下载tar包到机器上

解压tar包到/usr/local目录下

1
tar xvf apache-tomcat-8.5.12.tar.gz -C /usr/local

修改bin目录下可执行文件权限

1
2
$ cd /usr/local/apache-tomcat-8.5.12/bin
$ chmod +x *.sh

指定startup.sh后,要等待很长时间才能将各个模块启动的解决方案

$JAVA_HOME/jre/lib/security/java.security文件中的securerandom.source=file:/dev/urandom替换为securerandom.source=file:/dev/./urandom

或者

catalina.sh中添加,export CATALINA_OPS="-Djava.security.egd=file:/dev/./urandom"

并发设置

catalina.sh文件中添添加如下内容
Java 8时

1
JAVA_OPTS="-server -Xms2048m -Xmx3072m -XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=512m"

Java 8之前的版本

1
JAVA_OPTS="-server -Xms2048m -Xmx3072m -XX:PermSize=512m -XX:MaxPermSize=512m"

server.xml文件需要配置的关键内容

1
2
3
4
5
6
7
8
9
10
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
maxThreads="2000" minSpareThreads="100" prestartminSpareThreads="true" maxQueueSize="2000" />
<Connector port="8080" protocol="HTTP/1.1"
executor="tomcatThreadPool" acceptCount="2000"
connectionTimeout="20000" URIEncoding="UTF-8"
compression="on"
compressionMinSize="2048"
compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain,application/javascript,image/gif,image/jpeg,image/jpg"
/>

解决无法showdown进程

bin/shutdown.sh文件将

1
exec "$PRGDIR"/"$EXECUTABLE" stop "$@"

修改加上 -force,修改后如下

1
exec "$PRGDIR"/"$EXECUTABLE" stop -force "$@"

然后在bin/catalina.sh文件,在

1
PRGDIR=`dirname "$PRG"`

后面加上

1
2
3
4
if [ -z "$CATALINA_PID" ]; then
CATALINA_PID=$PRGDIR/CATALINA_PID
cat $CATALINA_PID
fi

Tsung使用笔记

安装

  1. 安装tsung及其依赖

    1
    agt-get install tsung
  2. 基于已安装的tsung安装Tsung1.6

    1
    2
    3
    4
    5
    6
    7
    8
    9
    apt-get remove tsung
    wget http://tsung.erlang-projects.org/dist/tsung-1.6.0.tar.gz
    tar xvf tsung-1.6.0.tar.gz -C /usr/local
    cd /usr/local/tsung-1.6.0
    ./configure
    make
    make install

启动Tsung

简单执行Tsuing:tsung -f [配置文件地址] start
Tsung执行结束后,依然运行dashboard:tsung -f [配置文件地址] -k start
dashboard地址:http://[机器ip]:8091

Read More

macos配置mysql

macos安装mysql

1
brew install mysql

mysql服务

启动

1
mysql.server start

停止

1
mysql.server stop

连接mysql

1
mysql -h [主机地址] -u [用户名] -p [密码]

连接本地mysql,用户名和密码都为初始密码

1
mysql -u root

基于百度es搭建ELK笔记

ELK搭建

logstash 2.4.1

获取

使用wget命令通过官网的下载url下载,百度云es必须使用logstash 2.4.1以下版本

1
wget https://download.elastic.co/logstash/logstash/logstash-2.4.1.tar.gz

配合redis使用

redis作为input使用
data_type为

  • list时,redis客户端使用rpush或lpush保存数据。
  • channel时,订阅了redis个某个key,redis客户端使用PUBLISH保存数据。
  • pattern_channel时,订阅了redis的一组key(可模糊匹配),redis客户端使用PUBLISH保存数据。

kibana 4.1.11

获取

使用wget命令通过官网的下载url下载,百度云es必须使用kibana4.1.11以下版本

1
wget https://download.elastic.co/kibana/kibana/kibana-4.1.11-linux-x64.tar.gz

kibana连接elasticsearch主要配置项

1
2
3
elasticsearch_url: "[elasticsearch url]”
kibana_elasticsearch_username: 用户名 (可选)
kibana_elasticsearch_password: 密码 (可选)

kibana遇到no cached mapping for this field,解决方案如下

Go to Settings->Indices, select your index, and click the yellow “refresh” icon.
That will get rid of the warning, and perhaps make the field available in your visualization

swap配置笔记

设置swap

  1. dd if=/dev/zero of=/root/swap/tmp.swap bs=1M count=5120
  2. mkswap /root/swap/tmp.swap
  3. swapon /root/swap/tmp.swap
  4. 修改/etc/fstab文件,添加如下内容
    /root/swap/tmp.swap swap swap defaults 0 0
  5. swapon -sfreecat /proc/swaps查看

关闭swap

  1. swapoff /root/swap/tmp.swap
  2. 修改/etc/fstab文件

配置linux并发连接最大连接数

背景

linux机器默认的并发连接数大概为1000左右,高并发是难以支持的,所以要修改linux系统的各项参数

设置open files

查看open files:unlimit -a

临时设置open files数:ulimit -n [期望最大的open files数值]

永久设置open files数:/etc/security/limits.conf文件中添加如下两行

1
2
* soft nofile 50000
* hard nofile 50000

PS:ubuntu系统不能用*,必须指定用户

设置tcp优化

/etc/sysctl.conf文件中添加如下内容之后,执行sysctl -p启用配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
net.core.rmem_default = 256960
net.core.rmem_max = 513920
net.core.wmem_default = 256960
net.core.wmem_max = 513920
net.core.netdev_max_backlog = 2000
net.core.somaxconn = 2048
net.core.optmem_max = 81920
net.ipv4.tcp_mem = 131072 262144 524288
net.ipv4.tcp_rmem = 8760 256960 4088000
net.ipv4.tcp_wmem = 8760 256960 4088000
net.ipv4.tcp_keepalive_time = 1800
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_sack = 1
net.ipv4.tcp_fack = 1
net.ipv4.tcp_timestamps = 1
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 30
net.ipv4.ip_local_port_range = 1024 65000
net.ipv4.tcp_max_syn_backlog = 2048

测试

使用这个c1000k工具来测试你的系统最多支持多少并发连接.

elasticsearch使用笔记

使用url

查询logstash信息

1
http://[your-node-name]:[your-port]/[your-index]/_search?pretty

PS:url中的索引可以使用*号匹配

使用命令

curl命令取得指定index的统计结果

1
curl --user [your-admin]:[your-password] http://[your-node-name]:[your-port]/[your-index]/_count?pretty

screen命令使用笔记

screen使用

新建会话: screen
显示全部会话:screen -ls
通过screen列表中的pid重新登陆到分离的screen:screen -r [pid]

处于screen中,按Ctrl + a后,接

  • d: 退出当前screen
  • w: 左下角显示有哪些会话
  • c: 新建会话
  • n: 移到下一个窗口