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进行配置
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中的变量,他们是"父子"关系。
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;
}
# 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
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
编辑/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
Date date = new Date();
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.add(Calendar.DATE, -1);
date = calendar.getTime();
参见:超级强大的vim配置(vimplus)
Centos直接执行下面的就可以了
git clone https://github.com/chxuan/vimplus.git ~/.vimplus
cd ~/.vimplus
./install.sh
printf("Hello,my name is %s,i am %d years old\n", name, age);
print("Hello,my name is %s,i am %d years old\n" % (name, age));
Locust
gatling
应该导入到受信任的证书颁发机构中,导入之后如果没效果的话需要重启一下(反正Chrome需要重启,Firefox貌似不用)>>>
# 基本命令格式:
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
mvn dependency:copy-dependencies
# 查询当前的app
adb shell dumpsys window | findstr mCurrentFocus
# git删除master分支,很危险
git branch -D master
# 把当前分支设置为matser分支
git checkout -b master
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
在这里插入代码片
# 时间相减得小数日期
=TEXT((VALUE(O20)-VALUE(L20))*24,"0.0")
# 时间戳转换为时间
=TEXT((C4/1000+8*3600)/86400+70*365+19,"yyyy-mm-dd hh:mm:ss")
# 使用正则表达式提取参数:
引用名称:对应保存的变量名
正则表达式:略
模板:正则表达式中的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中一样,该怎么导包还怎么导包
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,任选一个就行,单独百度
// 解决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 clean install -DskipTests
# 或
mvn clean install -Dmaven.test.skip=true
# 复制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)
# 查看一个进程启动的详细时间
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层,有个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语言定义的线程状态分析
转自
前言:这两个异常报出的时候,说明客户端没法正常连接到服务端,但是两者还是有区别的。
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。
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 super T, A, R> collector)
R java.util.stream.Stream.collect(Supplier supplier, BiConsumer
没看明白啥意思。。
IntSummaryStatistics java.util.stream.IntStream.summaryStatistics()
summaryStatistics方法可以返回一个IntSummaryStatistics对象,此对象具有一些对数值类型的基本统计功能,如:getMax、getMax、getMax、getAverage等
服务端:
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
// 创建一个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());
}
}
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左右。
在这里插入代码片
# 查看所有参数
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;