【原】工作常用笔记

文章目录

  • JMX端口配置:
  • Jmeter相关插件下载地址:
  • JS设置table中的td最大宽度,鼠标停在上面显示所有文字:
  • Centos上的一些配置:
  • VMware安装Centos虚拟机,解决上网问题:
  • Linux下,Java环境变量配置:
  • 获取一天前的时间(JAVA):
  • vim配置(直接拿大神的配置即可):
  • C语言格式字符串:
  • Python格式字符串:
  • 性能测试工具其他:
  • 浏览器证书导入(Gatling、Jmeter之类的):
  • Jmeter执行命令,输出测试报告:
  • 将pom.xml的文件下载到当前位置:
  • ADB命令:
  • Shell常用命令:
  • Bat常用命令:
  • excel常用函数:
  • Jmeter脚本编写技巧:
  • PHP服务器性能分析:
  • Java的一些小知识点:
  • mvn:
  • kafka:
  • Linux系统资源相关命令:
  • TCP的几个状态 (SYN, FIN, ACK, PSH, RST, URG)
  • Java线程状态&转换
  • Connection timed out和Connection refused的区别
  • Java 8新特性学习
  • NTP时钟同步配置
  • AKKA - Java简单使用
  • JVM启动参数配置:
  • MySql相关:

JMX端口配置:

JAVA_OPTS="-XX:+UnlockCommercialFeatures -XX:+FlightRecorder -Dcom.sun.management.jmxremote.port=18999 -Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname=10.31.3.245"

# 其中这一段-XX:+UnlockCommercialFeatures -XX:+FlightRecorder商业上需要收费的
# jmc的飞行记录器需要开启这个

注:tomcat应当使用CATALINA_OPTS进行配置

Jmeter相关插件下载地址:

https://jmeter-plugins.org/downloads/old/

Jsch远程执行命令问题:
/etc/profile: 用来设置系统环境参数,比如$PATH. 这里面的环境变量是对系统内所有用户生效的。
/etc/bashrc: 这个文件设置系统bash shell相关的东西,对系统内所有用户生效。只要用户运行bash命令,那么这里面的东西就在起作用。
~/.bash_profile: 用来设置一些环境变量,功能和/etc/profile 类似,但是这个是针对用户来设定的。
~/.bashrc: 作用类似于/etc/bashrc, 只是针对用户自己而言,不对其他用户生效。
~/.bash_profile 是交互式、login 方式进入 bash 运行的,意思是只有用户登录时才会生效。
~/.bashrc 是交互式 non-login 方式进入 bash 运行的,用户不一定登录,只要以该用户身份运行命令行就会读取该文件。
/etc/profile中设定的变量(全局)的可以作用于任何用户,而~/.bashrc等中设定的变量(局部)只能继承/etc/profile中的变量,他们是"父子"关系。

JS设置table中的td最大宽度,鼠标停在上面显示所有文字:


table td{
    max-width: 500px;
    word-wrap: break-word;
    text-overflow: ellipsis;
    white-space: nowrap;
    overflow: hidden;
}
table td:hover{
    white-space: normal;
    overflow: auto;
}

Centos上的一些配置:

# ifconfig命令
# 先查一下,属于哪个包
$ yum search ifconfig
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: mirrors.cqu.edu.cn
 * extras: mirrors.cqu.edu.cn
 * updates: mirror.lzu.edu.cn
============================================================================================= Matched: ifconfig =============================================================================================
net-tools.x86_64 : Basic networking tools
# 然后安装这个包即可
$ yum install net-tools.x86_64


# ssh服务,一般来说已经配好了
# 查看一下是否已安装相关软件包
$ rpm -qa | grep ssh
openssh-clients-7.4p1-16.el7.x86_64
libssh2-1.4.3-10.el7_2.1.x86_64
openssh-7.4p1-16.el7.x86_64
openssh-server-7.4p1-16.el7.x86_64
# 如果没有,则需要安装
$ yum install openssh-server
# 查看ssh服务状态,开启ssh服务略
$ service sshd status
Redirecting to /bin/systemctl status sshd.service
● sshd.service - OpenSSH server daemon
   Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)
   Active: active (running) since Sat 2018-12-15 06:18:20 EST; 7h left
     Docs: man:sshd(8)
           man:sshd_config(5)
 Main PID: 1038 (sshd)
   CGroup: /system.slice/sshd.service
           └─1038 /usr/sbin/sshd -D

Dec 15 06:18:20 localhost.localdomain systemd[1]: Starting OpenSSH server daemon...
Dec 15 06:18:20 localhost.localdomain sshd[1038]: Server listening on 0.0.0.0 port 22.
Dec 15 06:18:20 localhost.localdomain sshd[1038]: Server listening on :: port 22.
Dec 15 06:18:20 localhost.localdomain systemd[1]: Started OpenSSH server daemon.
Dec 15 06:26:59 localhost.localdomain sshd[1518]: Accepted password for root from 192.168.126.1 port 9639 ssh2
Dec 15 06:26:59 localhost.localdomain sshd[1522]: Accepted password for root from 192.168.126.1 port 9641 ssh2
# 查看ssh的端口是否打开
$ netstat -ntpl | grep 22
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 17816/sshd
tcp6 0 0 :::22 :::* LISTEN 17816/sshd


# sar、iostat
$ yum search sysstat
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: mirrors.cqu.edu.cn
 * extras: mirrors.cqu.edu.cn
 * updates: mirror.lzu.edu.cn
=========================================================================================== N/S matched: sysstat ============================================================================================
sysstat.x86_64 : Collection of performance monitoring tools for Linux

  Name and summary matches only, use "search all" for everything.
 $ yun install sysstat.x86_64


# 配置Java环境(下面有)
# 配置vim

VMware安装Centos虚拟机,解决上网问题:

  1. 网络适配器选择桥接模式即可(不需要勾选复制物理网络连接状态,实在上不去网再勾选试试看)
  2. 编辑/etc/sysconfig/network-scripts/ifcfg-ens33(一般都是ens33)
  3. 注意最后一行ONBOOT=yes,默认是no,改成yes重启即可,应该是只修改这一行即可
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=dhcp
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=04eb5440-c486-44e7-96e7-0b174960812f
DEVICE=ens33
ONBOOT=yes

Linux下,Java环境变量配置:

编辑/etc/profile,最下方添加

JAVA_HOME=/opt/jdk1.8.0_181
CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
PATH=$JAVA_HOME/bin:$HOME/bin:$HOME/.local/bin:$PATH

这个里面也加一份/etc/bashrc

获取一天前的时间(JAVA):

Date date = new Date();
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.add(Calendar.DATE, -1);
date = calendar.getTime();

vim配置(直接拿大神的配置即可):

参见:超级强大的vim配置(vimplus)
Centos直接执行下面的就可以了

git clone https://github.com/chxuan/vimplus.git ~/.vimplus
cd ~/.vimplus
./install.sh

C语言格式字符串:

printf("Hello,my name is %s,i am %d years old\n", name, age);

Python格式字符串:

print("Hello,my name is %s,i am %d years old\n" % (name, age));

性能测试工具其他:

Locust
gatling

浏览器证书导入(Gatling、Jmeter之类的):

应该导入到受信任的证书颁发机构中,导入之后如果没效果的话需要重启一下(反正Chrome需要重启,Firefox貌似不用)>>>
【原】工作常用笔记_第1张图片
【原】工作常用笔记_第2张图片

Jmeter执行命令,输出测试报告:

# 基本命令格式:
jmeter -n -t <test JMX file> -l <test log file> -e -o <Path to output folder>
# 样例:
jmeter -n -t F:\PerformanceTest\TestCase\script\getToken.jmx -l testLogFile -e -o ./output

# 基本命令格式:
jmeter -g <log file> -o <Path to output folder>
# 样例:
jmeter -g D:\apache-jmeter-3.0\bin\testLogFile -o ./output

将pom.xml的文件下载到当前位置:

  • 新建一个文件夹,将pom.xml放进去
  • 新建一个bat文件,内容是
mvn dependency:copy-dependencies
  • 执行这个bat文件就行
  • 即可下载pom中引用的jar到当前目录的taget目录下

ADB命令:

# 查询当前的app
adb shell dumpsys window | findstr mCurrentFocus 
# git删除master分支,很危险
git branch -D master
# 把当前分支设置为matser分支
git checkout -b master 

Shell常用命令:

sar -n DEV 1 3
du -sh *
df -lh
fdisk -l

top -Hp pid

# 解决远程挂载不上的问题
yum install nfs-utils

# yum查看安装的软件,卸载软件
yum list installed | grep docker
yum -y remove docker-engine.x86_64

# nmon常用
ps -ef | grep nmon | awk '{print $2}'| xargs kill -9
./nmon -f -t -s 30 -c 900000

# 格式化/挂载磁盘
mkfs.ext3 /dev/xvde
mkdir -p /opt/huawei
mount /dev/xvde /opt/huawei
vi /etc/fstab
/dev/xvde /opt/huawei ext3 defaults 0 0

Bat常用命令:

在这里插入代码片

excel常用函数:

# 时间相减得小数日期
=TEXT((VALUE(O20)-VALUE(L20))*24,"0.0")

# 时间戳转换为时间
=TEXT((C4/1000+8*3600)/86400+70*365+19,"yyyy-mm-dd hh:mm:ss")

Jmeter脚本编写技巧:

# 使用正则表达式提取参数:
引用名称:对应保存的变量名
正则表达式:略
模板:正则表达式中的group,$2$对应组2,依次类推
匹配数字:一般都是0,不知道干嘛的
缺省值:匹配不到的时候的默认值

# 使用BeanShell PostProcessor保存全局变量:
# 将某一线程组内的变量通过__setProperty函数设置成Jmeter的全局变量
# 在另一线程组中通过__P(parameters,)}函数调用即可
# 这写方法可以直接在BeanShell中使用,虽然长得不像Java代码,但是Jmeter可以识别
${__setProperty(${uid}_token,${token},)};
${__P(${uid}_token,)}

# 操作变量
# 线程之间不共享
# 通过使用Bean shell内置对象vars可以对变量进行存取操作
# 参数支持Jmeter的${xxx}变量
vars.put("key", "value");
vars.get("key");

# 操作属性
# 通过使用Bean shell内置对象props 可以对属性进行存取操作
# 默认属性定义在jmeter.properties中
props.get("START.HMS");
props.put("PROP1","1234");

# Bean Shell中同样支持函数的编写,写法和Java中一样,该怎么导包还怎么导包

PHP服务器性能分析:

yum -y install gcc

# centos7安装php7
[详见](https://www.jb51.net/article/109228.htm)
[](https://blog.csdn.net/anzhen0429/article/details/79272893)

# yum安装,安装之后少php-fpm、php-config,需要按照下面的流程处理
# 安装epel-release
rpm -ivh http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noarch.rpm
# 安装PHP7的rpm源
rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm
# 安装php7
yum install php70w

# 源码安装,似乎不会少东西,还没试过
# 下载源码
wget -O php7.tar.gz http://cn2.php.net/get/php-7.1.1.tar.gz/from/this/mirror
tar -xvf php7.tar.gz
cd php-7.0.4
# 安装依赖包
yum -y install libxml2 libxml2-devel openssl openssl-devel bzip2 bzip2-devel libcurl libcurl-devel libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel gmp gmp-devel libmcrypt libmcrypt-devel readline readline-devel libxslt libxslt-devel
# 编译配置(如果出现错误,基本都是上一步的依赖文件没有安装所致)
./configure \
--prefix=/usr/local/php \
--with-config-file-path=/etc \
--enable-fpm \
--with-fpm-user=nginx \
--with-fpm-group=nginx \
--enable-inline-optimization \
--disable-debug \
--disable-rpath \
--enable-shared \
--enable-soap \
--with-libxml-dir \
--with-xmlrpc \
--with-openssl \
--with-mcrypt \
--with-mhash \
--with-pcre-regex \
--with-sqlite3 \
--with-zlib \
--enable-bcmath \
--with-iconv \
--with-bz2 \
--enable-calendar \
--with-curl \
--with-cdb \
--enable-dom \
--enable-exif \
--enable-fileinfo \
--enable-filter \
--with-pcre-dir \
--enable-ftp \
--with-gd \
--with-openssl-dir \
--with-jpeg-dir \
--with-png-dir \
--with-zlib-dir \
--with-freetype-dir \
--enable-gd-native-ttf \
--enable-gd-jis-conv \
--with-gettext \
--with-gmp \
--with-mhash \
--enable-json \
--enable-mbstring \
--enable-mbregex \
--enable-mbregex-backtrack \
--with-libmbfl \
--with-onig \
--enable-pdo \
--with-mysqli=mysqlnd \
--with-pdo-mysql=mysqlnd \
--with-zlib-dir \
--with-pdo-sqlite \
--with-readline \
--enable-session \
--enable-shmop \
--enable-simplexml \
--enable-sockets \
--enable-sysvmsg \
--enable-sysvsem \
--enable-sysvshm \
--enable-wddx \
--with-libxml-dir \
--with-xsl \
--enable-zip \
--enable-mysqlnd-compression-support \
--with-pear \
--enable-opcache
# 安装
make && make install
# 配置环境变量/etc/profile
PATH=$PATH:/usr/local/php/bin
export PATH
# source一下
source /etc/profile
# 配置php-fpm
cp php.ini-production /etc/php.ini
cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf
cp /usr/local/php/etc/php-fpm.d/www.conf.default /usr/local/php/etc/php-fpm.d/www.conf
cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
chmod +x /etc/init.d/php-fpm
# 启动php-fpm
/etc/init.d/php-fpm start

# 附上官网安装说明
http://php.net/manual/zh/install.unix.nginx.php

# 解决yum安装php7之后找不到php-fpm的问题
yum -y install php70w-fpm php70w-cli php70w-gd php70w-mcrypt php70w-mysql php70w-pear php70w-xml php70w-mbstring php70w-pdo php70w-json php70w-pecl-apcu php70w-pecl-apcu-devel

# php-fpm重启
kill -USR2 pid
# service restart php-fpm也行

# 解决yum安装php7之后找不到php-config的现象
yum -y install php70w-devel 

# 下载源码
git clone https://github.com/longxinH/xhprof.git ./xhprof

# 编译源码并安装
cd xhprof/extension/
/path/to/php7/bin/phpize
./configure --with-php-config=/path/to/php7/bin/php-config
make && sudo make install

# 在php.ini中添加
[xhprof]
extension = xhprof.so
xhprof.output_dir = /tmp/xhprof

# 安装绘图工具
yum install graphviz

# 在PHP代码入口处添
xhprof_enable();

# 在PHP代码出口处添加
# 停止监控
$xhprof_data = xhprof_disable();
# 导入工具包,需注意工具包的位置
include_once "/xhprof_lib/utils/xhprof_lib.php";
include_once "/xhprof_lib/utils/xhprof_runs.php";
# 保存结果到xhprof.output_dir设置的目录
$xhprof_runs = new XHProfRuns_Default();
# save the run under a namespace "xhprof_foo"
$run_id = $xhprof_runs->save_run($xhprof_data, "xhprof_foo");
# 可以将这个打印到日志中,或者直接返回出来,也可以直接到xhprof.output_dir目录下看
echo "---------------http://....../xhprof_html/index.php?run=$run_id&source=xhprof_foo\n".---------------\n";
# 注意:需将xhprof目录下的examples、xhprof_html、xhprof_lib放到合适位置
# examples:是一个示例PHP文件
# xhprof_html:用来展示收集到的性能结果
# xhprof_lib:用来整理性能数据的库

# 启动、重启php-fpm,php-fpm -R是以root用户启动,默认不支持

# 下面还需要搭建&配置一下nginx或者apache,任选一个就行,单独百度

Java的一些小知识点:

// 解决exec执行复杂命令,管道符失效的问题
// linux下:
String[] command = { "/bin/sh", "-c", cmds };
Process ps = Runtime.getRuntime().exec(command );
// windows下:
String[] command = { "cmd", "/c", cmds };
Process ps = Runtime.getRuntime().exec(command );

mvn:

# 打包跳过测试
mvn clean install -DskipTests
# 或
mvn clean install -Dmaven.test.skip=true

kafka:

# 复制zookeeper的zoo_sample.cfg配置为zoo.cfg
# 根据需要进行配置

# 配置kafka的server.properties
# 根据需要进行log地址及线程配置
# 以下行放开注释并配置地址
listeners=PLAINTEXT://本机ip:9092
# 设置为false,不让程序自动创建topic,就是程序再往kafka生产数据的时候,如果发现topic不存在就会自动创建。**加粗样式**
auto.create.topics.enable=false
# 设置为true,删除topic的同时,会过一段时间删除目录和对应数据文件目录。
delete.topic.enable=true

# windows zookeepe启动
.\bin\zkServer.cmd
# windows kafka启动
.\bin\windows\kafka-server-start.bat .\config\server.properties
# linux差不多,执行对应sh文件

Kafka的集群管理工具AdminClient
创建Topic:createTopics(Collection<NewTopic> newTopics)
删除Topic:deleteTopics(Collection<String> topics)
显示所有Topic:listTopics()
查询Topic:describeTopics(Collection<String> topicNames)
查询集群信息:describeCluster()
查询ACL信息:describeAcls(AclBindingFilter filter)
创建ACL信息:createAcls(Collection<AclBinding> acls)
删除ACL信息:deleteAcls(Collection<AclBindingFilter> filters)
查询配置信息:describeConfigs(Collection<ConfigResource> resources)
修改配置信息:alterConfigs(Map<ConfigResource, Config> configs)
修改副本的日志目录:alterReplicaLogDirs(Map<TopicPartitionReplica, String> replicaAssignment)
查询节点的日志目录信息:describeLogDirs(Collection<Integer> brokers)
查询副本的日志目录信息:describeReplicaLogDirs(Collection<TopicPartitionReplica> replicas)
增加分区:createPartitions(Map<String, NewPartitions> newPartitions)

Linux系统资源相关命令:

# 查看一个进程启动的详细时间
ps -p 613742 -o lstart

##### https://blog.csdn.net/drievn/article/details/53179180 #####
# 查看CPU各个核心的资源占用情况,每秒
mpstat -P ALL 1 10

# 查看进程绑定的CPU信息统计,多进程应用会存在CPU绑定不均匀导致CPU使用不均匀的问题
pidstat | grep php-fpm | awk '{print $(NF-1)}' | sort | uniq -c

# 绑定进程的脚本
#!/bin/bash
CPUs=$(grep -c "processor" /proc/cpuinfo)
PIDs=$(ps -aux|grep "php-fpm[:] pool"|awk 'print $2}')
let i=0
for PID in $PIDs;do
    CPU=$(echo "$i%$CPUs"|bc)
    let i++
    taskset -pc $CPU $PID
done



##### http://blog.chinaunix.net/uid-23284114-id-3549663.html #####
# 参数 -d 表示,显示设备(磁盘)使用状态;-k某些使用block为单位的列强制使用Kilobytes为单位;1 10表示,数据显示每隔1秒刷新一次,共显示10次。
iostat -d -k 1 10
Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sda              39.29        21.14         1.44  441339807   29990031
sda1              0.00         0.00         0.00       1623        523
# tps:该设备每秒的传输次数,“一次传输”意思是“一次I/O请求”。多个逻辑请求可能会被合并为“一次I/O请求”。“一次传输”请求的大小是未知的。
# kB_read/s:每秒从设备(drive expressed)读取的数据量。
# kB_wrtn/s:每秒向设备(drive expressed)写入的数据量。
# kB_read:读取的总数据量;kB_wrtn:写入的总数量数据量;这些单位都为Kilobytes

iostat -x 1
Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
vda               0.00     0.36    0.03    0.61     0.48    21.03    67.94     0.01   12.80    3.64   13.22   0.49   0.03
vdb               0.00     0.00    0.00    0.00     0.00     0.00    24.06     0.00    5.53    5.68    0.42   1.64   0.00

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
vda               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
vdb               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
# -x参数可以显示更多统计信息
# rrqm/s:每秒这个设备相关的读取请求有多少被Merge了(当系统调用需要读取数据的时候,VFS将请求发到各个FS,如果FS发现不同的读 取请求读取的是相同Block的数据,FS会将这个请求合并Merge);wrqm/s:每秒这个设备相关的写入请求有多少被Merge了。
# (我的iostat版本没这个显示)rsec/s:每秒读取的扇区数;wsec/:每秒写入的扇区数。
# r/s:The number of read requests that were issued to the device per second;w/s:The number of write requests that were issued to the device per second;
# await:每一个IO请求的处理的平均时间(单位是微秒毫秒)。这里可以理解为IO的响应时间,一般地系统IO响应时间应该低于5ms,如果大于10ms就比较大了。
# %util:在统计时间内所有处理IO时间,除以总共统计时间。例如,如果统计间隔1秒,该设备有0.8秒在处理IO,而0.2秒闲置,那么该设备 的%util = 0.8/1 = 80%,所以该参数暗示了设备的繁忙程度。一般地,如果该参数是100%表示设备已经接近满负荷运行了(当然如果是多磁盘,即使%util是100%,因 为磁盘的并发能力,所以磁盘使用未必就到了瓶颈)。 

# 常见用法
# 查看TPS和吞吐量信息
iostat -d -k 1 10
# 查看设备使用率(%util)、响应时间(await)
iostat -d -x -k 1 10
# 查看cpu状态
iostat -c 1 10

##### sar常用命令:https://www.cnblogs.com/howhy/p/6396437.html #####
# 统计CPU使用情况
sar -u 1 3
04:52:55 PM     CPU     %user     %nice   %system   %iowait    %steal     %idle
04:52:56 PM     all      0.13      0.00      0.13      0.00      0.00     99.75
04:52:57 PM     all      0.13      0.00      0.13      0.00      0.00     99.75
04:52:58 PM     all      0.50      0.00      0.25      0.12      0.00     99.12
Average:        all      0.25      0.00      0.17      0.04      0.00     99.54
# %user #用户空间的CPU使用
# %nice 改变过优先级的进程的CPU使用率
# %system 内核空间的CPU使用率
# %iowait CPU等待IO的百分比 
# %steal 虚拟机的虚拟机CPU使用的CPU
# %idle 空闲的CPU
# 在以上的显示当中,主要看%iowait和%idle,%iowait过高表示存在I/O瓶颈,即磁盘IO无法满足业务需求,如果%idle过低表示CPU使用率比较严重,需要结合内存使用等情况判断CPU是否瓶颈。

# 显单个CPU的使用情况
sar -P 0 1 3
06:42:13 PM     CPU     %user     %nice   %system   %iowait    %steal     %idle
06:42:14 PM       0     53.00      0.00      6.00      0.00      0.00     41.00
06:42:15 PM       0     57.58      0.00      4.04      0.00      0.00     38.38
06:42:16 PM       0     52.58      0.00      6.19      0.00      0.00     41.24
Average:          0     54.39      0.00      5.41      0.00      0.00     40.20
# CPU 第几个CPU
# %user 用户态的CPU使用统计
# %nice 更改过优先级的进程的CPU使用统计
# %iowait CPU等待IO数据的百分比
# %steal 虚拟机的vCPU占用的物理CPU的百分比
# %idle 空闲的CPU百分比

# 查看平均负载
sar -q 1 3
06:44:25 PM   runq-sz  plist-sz   ldavg-1   ldavg-5  ldavg-15
06:44:26 PM         2       842      0.37      0.63      0.78
06:44:27 PM         4       842      0.37      0.63      0.78
06:44:28 PM         3       842      0.37      0.63      0.78
Average:            3       842      0.37      0.63      0.78
# runq-sz  运行队列的长度(等待运行的进程数,每核的CP不能超过3个)
# plist-sz 进程列表中的进程(processes)和线程数(threads)的数量
# ldavg-1 最后1分钟的CPU平均负载,即将多核CPU过去一分钟的负载相加再除以核心数得出的平均值,5分钟和15分钟以此类推
# ldavg-5 最后5分钟的CPU平均负载
# ldavg-15 最后15分钟的CPU平均负载

# 查看内存使用情况
sar -r 1 3
06:45:20 PM kbmemfree kbmemused  %memused kbbuffers  kbcached  kbcommit   %commit
06:45:21 PM    738416  15595048     95.48      8324    171104  22171856    108.53
06:45:22 PM    738292  15595172     95.48      8332    171296  22171856    108.53
06:45:23 PM    737796  15595668     95.48      8332    171488  22171856    108.53
Average:       738168  15595296     95.48      8329    171296  22171856    108.53
# kbmemfree  空闲的物理内存大小
# kbmemused  使用中的物理内存大小
# %memused 物理内存使用率
# kbbuffers 内核中作为缓冲区使用的物理内存大小,kbbuffers和kbcached:这两个值就是free命令中的buffer和cache. 
# kbcached 缓存的文件大小
# kbcommit  保证当前系统正常运行所需要的最小内存,即为了确保内存不溢出而需要的最少内存(物理内存+Swap分区)
# commit 这个值是kbcommit与内存总量(物理内存+swap分区)的一个百分比的值

# 查看系统swap分区的统计信息
sar -W 1 3
06:46:15 PM  pswpin/s pswpout/s
06:46:16 PM      0.00      0.00
06:46:17 PM      0.00      0.00
06:46:18 PM      0.00      0.00
Average:         0.00      0.00
# pswpin/s  每秒从交换分区到系统的交换页面(swap page)数量
# pswpott/s 每秒从系统交换到swap的交换页面(swap page)的数量

# 查看I/O和传递速率的统计信息
sar -b 1 3
06:47:29 PM       tps      rtps      wtps   bread/s   bwrtn/s
06:47:30 PM      4.08      0.00      4.08      0.00     32.65
06:47:31 PM      0.00      0.00      0.00      0.00      0.00
06:47:32 PM      0.00      0.00      0.00      0.00      0.00
Average:         1.35      0.00      1.35      0.00     10.77
# tps  磁盘每秒钟的IO总数,等于iostat中的tps
# rtps 每秒钟从磁盘读取的IO总数
# wtps 每秒钟从写入到磁盘的IO总数
# bread/s 每秒钟从磁盘读取的块总
# bwrtn/s 每秒钟此写入到磁盘的块总数

# 磁盘使用详情统计
sar -d -p 1 3
06:48:57 PM       DEV       tps  rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz     await     svctm     %util
06:48:58 PM  dev252-0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
06:48:58 PM dev252-16      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00

06:48:58 PM       DEV       tps  rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz     await     svctm     %util
06:48:59 PM  dev252-0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
06:48:59 PM dev252-16      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00

06:48:59 PM       DEV       tps  rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz     await     svctm     %util
06:49:00 PM  dev252-0      4.04      0.00     32.32      8.00      0.00      1.00      0.25      0.10
06:49:00 PM dev252-16      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00

Average:          DEV       tps  rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz     await     svctm     %util
Average:     dev252-0      1.34      0.00     10.74      8.00      0.00      1.00      0.25      0.03
Average:    dev252-16      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
# DEV 磁盘设备的名称,如果不加-p,会显示dev253-0类似的设备名称,因此加上-p显示的名称更直接
# tps:每秒I/O的传输总数
# rd_sec/s 每秒读取的扇区的总数
# wr_sec/s 每秒写入的扇区的 总数
# avgrq-sz 平均每次次磁盘I/O操作的数据大小(扇区)
# avgqu-sz 磁盘请求队列的平均长度
# await 从请求磁盘操作到系统完成处理,每次请求的平均消耗时间,包括请求队列等待时间,单位是毫秒(1秒等于1000毫秒),等于寻道时间+队列时间+服务时间
# svctm I/O的服务处理时间,即不包括请求队列中的时间
# %util I/O请求占用的CPU百分比,值越高,说明I/O越慢

# 进程、inode、文件和锁表状态
sar -v 1 3
06:50:52 PM dentunusd   file-nr  inode-nr    pty-nr
06:50:53 PM      3885      3936     10854         6
06:50:54 PM      3885      3904     10854         6
06:50:55 PM      3885      3936     10854         6
Average:         3885      3925     10854         6
# dentunusd 在缓冲目录条目中没有使用的条目数量
# file-nr 被系统使用的文件句柄数量
# inode-nr 已经使用的索引数量 
# pty-nr 使用的pty数量

# 统计网络信息
sar -n [DEV,EDEV,NFS,NFSD,SOCK,IP,EIP,ICMP,EICMP,TCP,ETCP,UDP,SOCK6,IP6,EIP6,ICMP6,EICMP6,UDP6] 1 3
# DEV显示网络接口信息,EDEV显示关于网络错误的统计数据
# NFS统计活动的NFS客户端的信息,NFSD统计NFS服务器的信息,SOCK显示套接字信息,ALL显示所有5个开关
# 它们可以单独或者一起使用

TCP的几个状态 (SYN, FIN, ACK, PSH, RST, URG)

在TCP层,有个FLAGS字段,这个字段有以下几个标识:SYN, FIN, ACK, PSH, RST, URG.

其中,对于我们日常的分析有用的就是前面的五个字段。

它们的含义是:

SYN表示建立连接,

FIN表示关闭连接,

ACK表示响应,

PSH表示有 DATA数据传输,

RST表示连接重置。

其中,ACK是可能与SYN,FIN等同时使用的,比如SYN和ACK可能同时为1,它表示的就是建立连接之后的响应,

如果只是单个的一个SYN,它表示的只是建立连接。

TCP的几次握手就是通过这样的ACK表现出来的。

但SYN与FIN是不会同时为1的,因为前者表示的是建立连接,而后者表示的是断开连接。

RST一般是在FIN之后才会出现为1的情况,表示的是连接重置。

一般地,当出现FIN包或RST包时,我们便认为客户端与服务器端断开了连接;而当出现SYN和SYN+ACK包时,我们认为客户端与服务器建立了一个连接。

PSH为1的情况,一般只出现在 DATA内容不为0的包中,也就是说PSH为1表示的是有真正的TCP数据包内容被传递。

TCP的连接建立和连接关闭,都是通过请求-响应的模式完成的。

概念补充-TCP三次握手:

TCP(Transmission Control Protocol)传输控制协议

TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接:

位码即tcp标志位,有6种标示:SYN(synchronous建立联机) ACK(acknowledgement 确认) PSH(push传送) FIN(finish结束) RST(reset重置) URG(urgent紧急)Sequence number(顺序号码) Acknowledge number(确认号码)

第一次握手:主机A发送位码为syn=1,随机产生seq number=1234567的数据包到服务器,主机B由SYN=1知道,A要求建立联机;

第二次握手:主机B收到请求后要确认联机信息,向A发送ack number=(主机A的seq+1),syn=1,ack=1,随机产生seq=7654321的包;

第三次握手:主机A收到后检查ack number是否正确,即第一次发送的seq number+1,以及位码ack是否为1,若正确,主机A会再发送ack number=(主机B的seq+1),ack=1,主机B收到后确认seq值与ack=1则连接建立成功。

完成三次握手,主机A与主机B开始传送数据。


在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。
第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。完成三次握手,客户端与服务器开始传送数据.

Java线程状态&转换

Java语言定义的线程状态分析

Connection timed out和Connection refused的区别

转自
前言:这两个异常报出的时候,说明客户端没法正常连接到服务端,但是两者还是有区别的。
1:Connection timed out
当得到 Connection timed out: connect 的时候表示TCP路由不正常,原因有很多,可能是服务器无法ping通,可能是服务器(防火墙等)丢弃了该请求报文包,也可能是服务器应答太慢,又或者存在间歇性的问题(这种情况很难从日志文件中排查问题)。
2:Connection refused
当得到Connection refused: connect 异常的时候表示从本地客户端到目标IP地址的路由是正常的,但是该目标端口没有进程在监听,然后服务端拒绝掉了连接。
一个成功的tcp链接将会看到Syn,Syn-Ack,Ack,这也就是我们预期的TCP三次握手。当使用tcpdump或wireshark抓包工具来探测发送过来的请求报文包时,Connection refused将会看到Syn,Rst。

Java 8新特性学习

Lambda 表达式
简单示例:
() -> 5
x -> 2 * x
(x, y) -> x – y
(int x, int y) -> x + y
(String s) -> System.out.print(s)
(int a, int b) -> { return a * b; }

方法引用:
方法引用通过方法的名字来指向一个方法
方法引用使用一对冒号::
构造器引用:它的语法是Class::new
静态方法引用:它的语法是Class::static_method
特定类的任意对象的方法引用:它的语法是Class::method
特定对象的方法引用:它的语法是instance::method

函数式接口:
package:java.util.function

默认方法:
默认方法就是接口可以有实现方法,而且不需要实现类去实现其方法
我们只需在方法名前面加个 default 关键字即可实现默认方法
如果子类实现的多个接口中有同名的默认方法,在使用的时候子类可以复写该方法,或者在使用的之后指定具体的父类.super.方法,如:Vehicle.super.print();

Optional 类:
Optional 类是一个可以为null的容器对象。如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象。
Optional 是个容器:它可以保存类型T的值,或者仅仅保存null。
Optional 提供很多有用的方法,这样我们就不用显式进行空值检测。
Optional 类的引入很好的解决空指针异常。

Steam:
在Java 8中, 集合接口有两个方法来生成流:stream() − 为集合创建串行流;stream() − 为集合创建串行流。
流式操作:

OptionalInt java.util.stream.IntStream.reduce(IntBinaryOperator op)
reduce方法可以将流中的数据依次处理,最终计算出一个值,比如可以很方便的完成对一个数组的阶乘操作

void java.util.stream.IntStream.forEach(IntConsumer action)
forEach方法可以用来迭代流中的每个数据

IntStream java.util.stream.IntStream.map(IntUnaryOperator mapper)
map方法可以对流中的每个数据进行一次处理,比如对一个List每一个数字求平方等

IntStream java.util.stream.IntStream.filter(IntPredicate predicate)
filter方法通过设置条件,过滤流中的元素

IntStream java.util.stream.IntStream.limit(long maxSize)
limit方法用于获取指定数量的流

IntStream java.util.stream.IntStream.sorted()
sorted方法用于对流进行排序

R java.util.stream.Stream.collect(Collector collector)
R java.util.stream.Stream.collect(Supplier supplier, BiConsumer accumulator, BiConsumer combiner)
没看明白啥意思。。

IntSummaryStatistics java.util.stream.IntStream.summaryStatistics()
summaryStatistics方法可以返回一个IntSummaryStatistics对象,此对象具有一些对数值类型的基本统计功能,如:getMax、getMax、getMax、getAverage等

NTP时钟同步配置

服务端:
service ntpd start

$ vim /etc/ntp.conf

//将这行给注释
#restrict default nomodify notrap nopeer noquery      
 
 
//然后添加这两行 ,意思是 允许IPV4 IPV6 查询 拒绝修改
restrict -4 default kod notrap nomodify    
restrict -6 default kod notrap nomodify
 
//添加修改上层时间服务器,如果能联通外网,则不需要修改,
server 0.rhel.pool.ntp.org iburst
server 1.rhel.pool.ntp.org iburst
server 2.rhel.pool.ntp.org iburst
server 3.rhel.pool.ntp.org iburst
//如果联不通外网,则把上面几行注释,然后添加下面两行,意思是设置成时间服务器是自己
server 127.127.1.0
fudge 127.127.1.0 stratum 8

客户端
service ntpd start

$ vim /etc/ntp.conf

server   192.168.10.20   iburst

同步时间: ntpdate 192.168.10.20

AKKA - Java简单使用

// 创建一个Actor
import akka.actor.AbstractActor;
import akka.actor.Props;

public class MyActor extends AbstractActor {

	// props方法用于ActorSystem对象的actorOf方法,创建ActorRef使用
	static public Props props(MyMessage myMessage) {
		
		// actorClass标识类型
		// creator是一个λ表达式,无传入参数,返回actorClass对象
		return Props.create(MyActor.class, () -> new MyActor(myMessage));
	}
	
	// 可以使用封装的消息(用一个个对象将消息封装)
	@SuppressWarnings("unused")
	private MyMessage myMessage;

	public MyActor() {}

	// 带参数的构造函数
	public MyActor(MyMessage myMessage) {

		this.myMessage = myMessage;
	}

	// 在这里面定义改Actor收到消息的处理方式
	@Override
	public Receive createReceive() {

		return receiveBuilder()
				.match(String.class, apply -> System.out.println("收到了String类型的消息:" + apply))
				.match(MyMessage.class, apply -> System.out.println("收到了MyMessage类型的消息:" + apply.message))
				.build();
	}
}

// 简单的封装消息
public class MyMessage {

	public String message;
	
	public MyMessage(String message) {
		
		this.message = message;
	}
}

// 程序入口&执行逻辑
import akka.actor.ActorRef;
import akka.actor.ActorSystem;

public class MyMain {

	public static void main(String[] args) {
		
		final ActorSystem system = ActorSystem.create("test_akka");
		
		// 创建Actor并获取它的引用
		ActorRef myActor_1 = system.actorOf(MyActor.props(new MyMessage("666")), "MyActor_1");
		
		// 同一个Actor可以创建多个
		ActorRef myActor_2 = system.actorOf(MyActor.props(new MyMessage("777")), "MyActor_2");
		
		myActor_1.tell("Hello", ActorRef.noSender());
		
		myActor_2.tell(new MyMessage("66666666666"), ActorRef.noSender());
	}
}


JVM启动参数配置:

http://www.cnblogs.com/andy-zhou/p/5327288.html

java -Xmx3550m -Xms3550m -Xmn2g –Xss128k

-Xmx3550m:设置JVM最大可用内存为3550M。

-Xms3550m:设置JVM促使内存为3550m。此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存。

-Xmn2g:设置年轻代大小为2G。整个堆大小=年轻代大小 + 年老代大小 + 持久代大小。持久代一般固定大小为64m,所以增大年轻代后,将会减小年老代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8。

-Xss128k:设置每个线程的堆栈大小。JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K。更具应用的线程所需内存大小进行调整。在相同物理内存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右。
在这里插入代码片

MySql相关:

# 查看所有参数
SHOW VARIABLES;

# 缓存相关参数查看,https://www.cnblogs.com/wangyiwei/p/7765457.html
SHOW VARIABLES LIKE '%query_cache%';

# 允许远程连接
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION;
FLUSH PRIVILEGES;

# 查询前100条
SELECT * FROM t_basic_message WHERE is_read = 1 LIMIT 0, 100;

# 显示哪些线程正在运行
SHOW PROCESSLIST;

你可能感兴趣的:(测试,笔记)