文章目录
- JVM启动参数配置:
- Jmeter相关笔记:
- Linux笔记:
- css常用样式:
- JavaScript/VUE技巧:
- Centos上的一些配置:
- VMware安装Centos虚拟机,解决上网问题:
- Linux下,Java环境变量配置:
- 获取一天前的时间(JAVA):
- vim配置(直接拿大神的配置即可):
- C语言格式字符串:
- Python格式字符串:
- 浏览器证书导入(Gatling、Jmeter之类的):
- 将pom.xml的文件下载到当前位置:
- ADB命令:
- Git命令:
- Shell常用命令:
- Bat常用命令:
- excel常用函数:
- PHP服务器性能分析:
- Java的一些小知识点:
- mvn:
- kafka:
- Linux相关命令:
- TCP的几个状态 (SYN, FIN, ACK, PSH, RST, URG)
- Java线程状态&转换
- Connection timed out和Connection refused的区别
- Java 8新特性学习
- NTP时钟同步配置
- AKKA - Java简单使用
- MySql相关:
JVM启动参数配置:
http://www.cnblogs.com/andy-zhou/p/5327288.html
java -Xmx3550m -Xms3550m -Xmn2g –Xss128k
# -Xmx8g:JVM最大可用堆内存
# -Xms8g:JVM初始化堆内存,一般设置Xms=Xmx
# -Xmn2g:设置年轻代大小为2G。整个堆大小=年轻代大小 + 年老代大小 + 持久代大小。持久代一般固定大小为64m,所以增大年轻代后,将会减小年老代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8。
# -Xss128k:设置每个线程的堆栈大小
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"
# 注:tomcat应当使用CATALINA_OPTS进行配置
# 其中这一段-XX:+UnlockCommercialFeatures -XX:+FlightRecorder商业上需要收费的
# jmc的飞行记录器需要开启这个
Jmeter相关笔记:
历史插件下载地址:
https://jmeter-plugins.org/downloads/old/
命令相关:
### 基本命令格式:
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
### 一些脚本编写技巧
# 使用正则表达式提取参数:
引用名称:对应保存的变量名
正则表达式:略
模板:正则表达式中的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中一样,该怎么导包还怎么导包
Linux笔记:
- /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中的变量,他们是"父子"关系。
css常用样式:
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;
}
JavaScript/VUE技巧:
// VUE中解决setInterval函数中的this不是指向VUE对象的问题
methods: {
A() {
let that = this
setInterval(function(){
that.B()
}, 1000)
},
B() {
console.info('run~')
}
}
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虚拟机,解决上网问题:
- 网络适配器选择桥接模式即可(不需要勾选复制物理网络连接状态,实在上不去网再勾选试试看)
- 编辑/etc/sysconfig/network-scripts/ifcfg-ens33(一般都是ens33)
- 注意最后一行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));
浏览器证书导入(Gatling、Jmeter之类的):
应该导入到受信任的证书颁发机构中,导入之后如果没效果的话需要重启一下(反正Chrome需要重启,Firefox貌似不用)>>>
将pom.xml的文件下载到当前位置:
- 新建一个文件夹,将pom.xml放进去
- 新建一个bat文件,内容是
mvn dependency:copy-dependencies
- 执行这个bat文件就行
- 即可下载pom中引用的jar到当前目录的taget目录下
ADB命令:
# 查询当前的app
adb shell dumpsys window | findstr mCurrentFocus
Git命令:
# 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")
# v-lookup
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 -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
# 安装PHP7的rpm源
rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm
# 安装php7
yum install php70w.x86_64 php70w-cli.x86_64 php70w-common.x86_64 php70w-gd.x86_64 php70w-ldap.x86_64 php70w-mbstring.x86_64 php70w-mcrypt.x86_64 php70w-mysql.x86_64 php70w-pdo.x86_64
# 安装php-fpm
yum install php70w-fpm php70w-opcache
# 启动
systemctl start php-fpm
# 开机启动设置
systemctl enable php-fpm
systemctl daemon-reload
# nginx配置
server {
listen 80;
#server_name www.test.com; #需要修改客户端hosts文件
root /opt/wordpress; #PHP项目根路径
index index.php index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
# 附上官网安装说明
http://php.net/manual/zh/install.unix.nginx.php
# php-fpm重启
kill -USR2 pid
# service restart php-fpm也行
# 下载源码
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用户启动,默认不支持
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 );
// 函数中有死循环,可以不要返回值,如:
public int test() {
while (true) {}
}
// SpringBoot中获取resources目录中的东西
Resource resource = new ClassPathResource("resource目录下的文件路径");
File file = resource.getFile();
// 如:
Resource resource = new ClassPathResource("scripts/test.jmx");
File file = resource.getFile();
// SpringBoot获取项目根目录
ClassUtils.getDefaultClassLoader().getResource("").getPath();
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相关命令:
# 查看端口占用进程
lsof -i:端口号
netstat -tunlp|grep 端口号
# sed
sed -i "s#localhost:8080#172.18.84.135:18080#g" file(s)
# 查看一个进程启动的详细时间
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线程状态&转换
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<? super T, A, R> collector)
R java.util.stream.Stream.collect(Supplier supplier, BiConsumer<R, ? super T> accumulator, BiConsumer<R, R> 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());
}
}
MySql相关:
# 查看所有参数
SHOW VARIABLES;
# 缓存相关参数查看,https://www.cnblogs.com/wangyiwei/p/7765457.html
SHOW VARIABLES LIKE '%query_cache%';
# 查看慢查询相关日志
SHOW VARIABLES LIKE 'slow_query%';
SHOW VARIABLES LIKE 'long_query_time';
# 设置方法
# 1:全局变量设置
SET GLOBAL slow_query_log='ON';
SET GLOBAL slow_query_log_file='/usr/local/mysql/data/slow.log';
SET GLOBAL long_query_time=1;
# 2:配置文件设置
# 修改配置文件my.cnf,在[mysqld]下的下方加入,然后重启mysql服务即可
[mysqld]
slow_query_log = ON
slow_query_log_file = /usr/local/mysql/data/slow.log
long_query_time = 1
# 查询前100条
SELECT * FROM t_basic_message WHERE is_read = 1 LIMIT 0, 100;
# 显示哪些线程正在运行
SHOW PROCESSLIST; # 显示前100条
SHOW FULL PROCESSLIST; # 显示所有
# kill 进程
kill 1825;
# 显示哪些表的打开的
SHOW OPEN TABLES;
# In_use列表示有多少线程正在使用某张表
# Name_locked表示表名是否被锁,这一般发生在Drop或Rename命令操作这张表时
# 查看服务器状态
SHOW STATUS LIKE '%lock%'
# 查看innodb引擎的运行时信息
SHOW ENGINE INNODB STATUS
# 查看服务器timeout配置
SHOW VARIABLES LIKE '%timeout%'
# 查询正在执行的事务
SELECT * FROM information_schema.INNODB_TRX
# 查看正在锁的事务
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS
# 查看等待锁的事务
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS
# 查看下autocommit的值
select @@autocommit;
# 查看数据库的隔离级别:
select @@tx_isolation;
# 查看表是什么时候更新的
SELECT * FROM information_schema.tables WHERE table_schema='test1' AND table_name='rpt_test';
# 查看正在执行的sql
# 方法一:使用processlist,但是有个弊端,就是只能查看正在执行的sql语句,对应历史记录,查看不到。好处是不用设置,不会保存。
use information_schema;
show processlist;
# 或者直接
select * from information_schema.`PROCESSLIST` where info is not null;
# 方法二:开启日志模式
# 1、开启/关闭
SET GLOBAL log_output = 'TABLE'; SET GLOBAL general_log = 'ON';
# SET GLOBAL log_output = 'TABLE'; SET GLOBAL general_log = 'OFF';
# 2、查询
SELECT * from mysql.general_log ORDER BY event_time DESC
# 3、清空表(delete对于这个表,不允许使用,只能用truncate)
# truncate table mysql.general_log;
# 密码复杂度
SHOW VARIABLES LIKE 'validate_password%';
# 密码验证等级
SET GLOBAL validate_password_policy=LOW;
# 密码最小长度限制修改(最小是4)
SET GLOBAL validate_password_length=6;
# 允许远程连接
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION;
FLUSH PRIVILEGES;
TODO
orzdba
redis-stat