工做經常使用筆記

JVM啓動參數配置:

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

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/css

命令相關:html

### 基本命令格式:
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筆記:

  1. /etc/profile: 用來設置系統環境參數,好比$PATH. 這裏面的環境變量是對系統內全部用戶生效的;
  2. /etc/bashrc: 這個文件設置系統bash shell相關的東西,對系統內全部用戶生效。只要用戶運行bash命令,那麼這裏面的東西就在起做用。
  3. ~/.bash_profile: 用來設置一些環境變量,功能和/etc/profile 相似,可是這個是針對用戶來設定的。
  4. ~/.bashrc: 做用相似於/etc/bashrc, 只是針對用戶本身而言,不對其餘用戶生效。
  5. ~/.bash_profile 是交互式、login 方式進入 bash 運行的,意思是隻有用戶登陸時纔會生效。
  6. ~/.bashrc 是交互式 non-login 方式進入 bash 運行的,用戶不必定登陸,只要以該用戶身份運行命令行就會讀取該文件。
  7. /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虛擬機,解決上網問題:

  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,最下方添加vue

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/bashrcjava

獲取一天前的時間(JAVA):

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

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

參見:超級強大的vim配置(vimplus)
Centos直接執行下面的就能夠了node

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貌似不用)>>>

python

將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

# 配置公網訪問(關閉listeners的配置,使用下面這個)
advertised.listeners=PLAINTEXT://49.234.13.92:9092

# 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線程狀態&轉換

Java語言定義的線程狀態分析mysql

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。
linux

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;

# 方法二:開啓日誌模式
# 一、開啓/關閉
SET GLOBAL log_output = 'TABLE';  SET GLOBAL general_log = 'ON';
# SET GLOBAL log_output = 'TABLE';  SET GLOBAL general_log = 'OFF';

# 二、查詢
SELECT * from mysql.general_log ORDER BY event_time DESC

# 三、清空表(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

相關文章
相關標籤/搜索