## Vmstat命令監控系統資源
Vmstat 【刷新延時 刷新次數】
## 舉例
```
[root@localhost ~]# vmstat 1 3
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
2 0 0 244952 165500 267684 0 0 0 8 6 5 0 0 99 0 0
0 0 0 244968 165500 267684 0 0 0 0 123 195 0 0 100 0 0
0 0 0 245000 165500 267684 0 0 0 0 26 44 1 0 99 0 0
```
## 釋義
r 表示運行隊列(就是說多少個進程真的分配到CPU),我測試的服務器目前CPU比較空閑,沒什么程序在跑,當這個值超過了CPU數目,就會出現CPU瓶頸了。這個也和top的負載有關系,一般負載超過了3就比較高,超過了5就高,超過了10就不正常了,服務器的狀態很危險。top的負載類似每秒的運行隊列。如果運行隊列過大,表示你的CPU很繁忙,一般會造成CPU使用率很高。
b 表示阻塞的進程,這個不多說,進程阻塞,大家懂的。
swpd 虛擬內存已使用的大小,如果大于0,表示你的機器物理內存不足了,如果不是程序內存泄露的原因,那么你該升級內存了或者把耗內存的任務遷移到其他機器。
free 空閑的物理內存的大小,我的機器內存總共8G,剩余3415M。
buff Linux/Unix系統是用來存儲,目錄里面有什么內容,權限等的緩存,我本機大概占用300多M
cache cache直接用來記憶我們打開的文件,給文件做緩沖,我本機大概占用300多M(這里是Linux/Unix的聰明之處,把空閑的物理內存的一部分拿來做文件和目錄的緩存,是為了提高 程序執行的性能,當程序使用內存時,buffer/cached會很快地被使用。)
si 每秒從磁盤讀入虛擬內存的大小,如果這個值大于0,表示物理內存不夠用或者內存泄露了,要查找耗內存進程解決掉。我的機器內存充裕,一切正常。
so 每秒虛擬內存寫入磁盤的大小,如果這個值大于0,同上。
bi 塊設備每秒接收的塊數量,這里的塊設備是指系統上所有的磁盤和其他塊設備,默認塊大小是1024byte,我本機上沒什么IO操作,所以一直是0,但是我曾在處理拷貝大量數據(2-3T)的機器上看過可以達到140000/s,磁盤寫入速度差不多140M每秒
bo 塊設備每秒發送的塊數量,例如我們讀取文件,bo就要大于0。bi和bo一般都要接近0,不然就是IO過于頻繁,需要調整。
in 每秒CPU的中斷次數,包括時間中斷
cs 每秒上下文切換次數,例如我們調用系統函數,就要進行上下文切換,線程的切換,也要進程上下文切換,這個值要越小越好,太大了,要考慮調低線程或者進程的數目,例如在apache和nginx這種web服務器中,我們一般做性能測試時會進行幾千并發甚至幾萬并發的測試,選擇web服務器的進程可以由進程或者線程的峰值一直下調,壓測,直到cs到一個比較小的值,這個進程和線程數就是比較合適的值了。系統調用也是,每次調用系統函數,我們的代碼就會進入內核空間,導致上下文切換,這個是很耗資源,也要盡量避免頻繁調用系統函數。上下文切換次數過多表示你的CPU大部分浪費在上下文切換,導致CPU干正經事的時間少了,CPU沒有充分利用,是不可取的。
us 用戶CPU時間,我曾經在一個做加密解密很頻繁的服務器上,可以看到us接近100,r運行隊列達到80(機器在做壓力測試,性能表現不佳)。
sy 系統CPU時間,如果太高,表示系統調用時間長,例如是IO操作頻繁。
id 空閑 CPU時間,一般來說,id + us + sy = 100,一般我認為id是空閑CPU使用率,us是用戶CPU使用率,sy是系統CPU使用率。
wt 等待IO CPU時間。
## 緩存和緩沖的區別
簡單地說緩存(cache)是用來加速數據從硬盤中‘讀取’的,而緩沖(buffer)是用來加速數據’寫入‘硬盤的。
## dmesg開機時沒和監測信息
dmesg
dmesg | grep CPU
## free命令查看內存使用狀態
free [-b|-k|-m|-g]
選項:
-b:以Byte為單位顯示內存使用情況;
-k:以KB為單位顯示內存使用情況;
-m:以MB為單位顯示內存使用情況;
-o:不顯示緩沖區調節列;
-s<間隔秒數>:持續觀察內存使用狀況;
-t:顯示內存總和列;
-V:顯示版本信息。
```
root@iZ2ze43t8c5urdfrq2dh4mZ:~# free -m
total used free shared buff/cache available
Mem: 992 177 169 2 644 629
Swap: 0 0 0
```
第一部分Mem行解釋:
total:內存總數;
used:已經使用的內存數;
free:空閑的內存數;
shared:當前已經廢棄不用;
buffers Buffer:緩存內存數;
cached Page:緩存內存數。
關系:total = used + free
第二部分(-/+ buffers/cache)解釋:
```
(-buffers/cache) used內存數:第一部分Mem行中的 used – buffers – cached
(+buffers/cache) free內存數: 第一部分Mem行中的 free + buffers + cached
```
可見-buffers/cache反映的是被程序實實在在吃掉的內存,而+buffers/cache反映的是可以挪用的內存總數。 第三部分是指交換分區。
第三部分:
total是swap(交換分區)的總數,used是已經使用的swap數,free是空閑swap數。默認單位KB
## 查看CPU
cat /proc/cpuinfo
## uptime命令
顯示系統啟動時間和平均負載,也是top命令第一行,w命令也可以看見。
## 查看系統與內核相關信息
uname
選項:
-a或--all:顯示全部的信息;
-m或--machine:顯示電腦類型;
-n或-nodename:顯示在網絡上的主機名稱;
-r或--release:顯示操作系統的發行編號;
-s或--sysname:顯示操作系統名稱;
-v:顯示操作系統的版本;
-p或--processor:輸出處理器類型或"unknown";
-i或--hardware-platform:輸出硬件平臺或"unknown";
-o或--operating-system:輸出操作系統名稱;
## 判斷系統位數
```
[root@localhost ~]# file /bin/ls
/bin/ls: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, stripped
```
## 查詢當前linux系統的發行版本
```
root@iZ2ze43t8c5urdfrq2dh4mZ:~# lsb_release -a
LSB Version: core-9.20160110ubuntu0.2-amd64:core-9.20160110ubuntu0.2-noarch:security-9.20160110ubuntu0.2-amd64:security-9.20160110ubuntu0.2-noarch
Distributor ID: Ubuntu
Description: Ubuntu 16.04.2 LTS
Release: 16.04
Codename: xenial
```
## lsof (list open files)命令
Lsof是一個列出當前系統打開文件的工具。在linux系統環境下,任何事物都可以以文件形式存在,通過文件不僅可以訪問常規的數據,還可以訪問網絡連接和硬件。
適應條件:lsof訪問的是核心文件和各種文件,所以必須以root用戶的身份運行才能充分發揮其功能。
語法:
```
lsof [選項] [絕對路徑的文件名]
```
簡單使用:
```
root@iZ2ze43t8c5urdfrq2dh4mZ:~# lsof | head -10
COMMAND PID TID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 1 root cwd DIR 253,1 4096 2 /
systemd 1 root rtd DIR 253,1 4096 2 /
systemd 1 root txt REG 253,1 1577232 1179964 /lib/systemd/systemd
systemd 1 root mem REG 253,1 18976 1180262 /lib/x86_64-linux-gnu/libuuid.so.1.3.0
systemd 1 root mem REG 253,1 262408 1180137 /lib/x86_64-linux-gnu/libblkid.so.1.1.0
systemd 1 root mem REG 253,1 14608 1185255 /lib/x86_64-linux-gnu/libdl-2.23.so
systemd 1 root mem REG 253,1 456632 1180223 /lib/x86_64-linux-gnu/libpcre.so.3.13.2
systemd 1 root mem REG 253,1 1868984 1185266 /lib/x86_64-linux-gnu/libc-2.23.so
systemd 1 root mem REG 253,1 138696 1185249 /lib/x86_64-linux-gnu/libpthread-2.23.so
```
每行顯示一個打開的文件,默認如果后面不跟任何東西,將打開系統打開的所有文件。
## 釋義
COMMAND :進程名稱
PID:進程標識符
USER:進程所有者
FD:文件描述符,應用程序通過文件描述符識別到該文件。如cwd、txt等
TYPE:文件類型,如DIR,REG
DEVICE:指定磁盤名稱
SIZE:文件大小
NODE:索引節點(文件在磁盤上的標識)
NAME:打開文件的確切名稱
### 常用命令
lsof abc.txt //顯示開啟文件abc.txt的進程
lsof -c abc //顯示abc進程現在打開的文件
lsof -c -p //1234 列出進程號為1234的進程所打開的文件
lsof -g gid //顯示歸屬gid的進程情況
lsof +d /usr/local/ //顯示目錄下被進程開啟的文件
lsof +D /usr/local/ //同上,但是會搜索目錄下的目錄,時間較長
lsof -d 4 //顯示使用fd為4的進程
lsof -i //用以顯示符合條件的進程情況
#### 下面的一些其它東西需要牢:
默認 : 沒有選項,lsof列出活躍進程的所有打開文件
組合 : 可以將選項組合到一起,如-abc,但要當心哪些選項需要參數
-a : 結果進行“與”運算(而不是“或”)
-l : 在輸出顯示用戶ID而不是用戶名
-h : 獲得幫助
-t : 僅獲取進程ID
-U : 獲取UNIX套接口地址
-F : 格式化輸出結果,用于其它命令。可以通過多種方式格式化,如-F pcfn(用于進程id、命令名、文件描述符、文件名,并以空終止)
獲取網絡信息
使用-i顯示所有連接
[root@node2 ~]# lsof -i
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 1532 root 3u IPv4 20505 0t0 TCP *:ssh (LISTEN)
sshd 1532 root 4u IPv6 20507 0t0 TCP *:ssh (LISTEN)
named 2159 named 20u IPv4 20041 0t0 TCP localhost:domain (LISTEN)
named 2159 named 21u IPv4 20043 0t0 TCP node2:domain (LISTEN)
使用-i 6僅獲取IPv6流量
[root@node2 ~]# lsof -i 6
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 1532 root 4u IPv6 20507 0t0 TCP *:ssh (LISTEN)
named 2159 named 23u IPv6 20081 0t0 TCP localhost:rndc (LISTEN)
master 2612 root 14u IPv6 21228 0t0 TCP localhost:smtp (LISTEN)
rpcbind 26533 rpc 9u IPv6 1752830 0t0 UDP *:sunrpc
rpcbind 26533 rpc 10u IPv6 1752831 0t0 UDP *:844
僅顯示TCP連接(同理可獲得UDP連接)
[root@node2 ~]# lsof -iTCP
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 1532 root 3u IPv4 20505 0t0 TCP *:ssh (LISTEN)
sshd 1532 root 4u IPv6 20507 0t0 TCP *:ssh (LISTEN)
named 2159 named 20u IPv4 20041 0t0 TCP localhost:domain (LISTEN)
named 2159 named 21u IPv4 20043 0t0 TCP node2:domain (LISTEN)
使用-i:port來顯示與指定端口相關的網絡信息
[root@node2 ~]# lsof -i :22
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 1532 root 3u IPv4 20505 0t0 TCP *:ssh (LISTEN)
sshd 1532 root 4u IPv6 20507 0t0 TCP *:ssh (LISTEN)
sshd 125842 root 3u IPv4 2083984 0t0 TCP node2:ssh->172.16.100.78:ff-fms (ESTABLISHED)
sshd 126106 root 3u IPv4 2089595 0t0 TCP node2:ssh->172.16.100.78:tapeware (ESTABLISHED)
使用@host來顯示指定到指定主機的連接(后面還可以加端口)
這對于在檢查是否開放連接到網絡中或互聯網上某個指定主機的連接時十分有用。
[root@node2 ~]# lsof -i@172.16.100.78
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 125842 root 3u IPv4 2083984 0t0 TCP node2:ssh->172.16.100.78:ff-fms (ESTABLISHED)
sshd 126106 root 3u IPv4 2089595 0t0 TCP node2:ssh->172.16.100.78:tapeware (ESTABLISHED)
找出監聽端口
找出正等候連接的端口。
[root@node2 ~]# lsof -i -sTCP:LISTEN
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 1532 root 3u IPv4 20505 0t0 TCP *:ssh (LISTEN)
sshd 1532 root 4u IPv6 20507 0t0 TCP *:ssh (LISTEN)
named 2159 named 20u IPv4 20041 0t0 TCP localhost:domain (LISTEN)
named 2159 named 21u IPv4 20043 0t0 TCP node2:domain (LISTEN)
用戶信息
使用-u顯示指定用戶打開了什么
[root@node2 ~]# lsof -u nginx
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nginx 32223 nginx cwd DIR 253,0 67 836967 /etc/nginx/conf.d
nginx 32223 nginx rtd DIR 253,0 4096 128 /
nginx 32223 nginx txt REG 253,0 1062288 202477571 /usr/sbin/nginx
使用-u ^user來顯示除指定用戶以外的其它所有用戶所做的事情
[root@node2 ~]# lsof -u ^root | head -20
COMMAND PID TID USER FD TYPE DEVICE SIZE/OFF NODE NAME
dbus-daem 894 dbus cwd DIR 253,0 4096 128 /
dbus-daem 894 dbus rtd DIR 253,0 4096 128 /
dbus-daem 894 dbus txt REG 253,0 441176 134616626 /usr/bin/dbus-daemon
殺死指定用戶所做的一切事情
[root@node2 ~]# kill -9 `lsof -t -u nginx`
命令和進程
可以查看指定程序或進程由什么啟動,這通常會很有用,而你可以使用lsof通過名稱或進程ID過濾來完成這個任務。下面列出了一些選項:
使用-c查看指定的命令正在使用的文件和網絡連接
[root@node2 ~]# lsof -c mysql
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
mysqld_sa 125321 mysql cwd DIR 253,0 4096 128 /
mysqld_sa 125321 mysql rtd DIR 253,0 4096 128 /
mysqld_sa 125321 mysql txt REG 253,0 960376 134771174 /usr/bin/bash
使用-p查看指定進程ID已打開的內容
[root@node2 ~]# lsof -p 126397
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nginx 126397 nginx cwd DIR 253,0 67 836967 /etc/nginx/conf.d
nginx 126397 nginx rtd DIR 253,0 4096 128 /
nginx 126397 nginx txt REG 253,0 1062288 202477571 /usr/sbin/nginx
-t選項只返回PID
[root@node2 ~]# lsof -t -c nginx
31537
126397
其他
顯示與指定目錄(或文件)交互的所有一切
[root@node2 ~]# lsof /var/log/
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
bash 125846 root cwd DIR 253,0 4096 67109037 /var/log
與tcpdump類似,當你開始組合查詢時,它就顯示了它強大的功能
[root@node2 ~]# lsof -u lurker -i @172.16.47.103
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
ssh 126475 root 3u IPv4 2093542 0t0 TCP node2:42889->node3:ssh (ESTABLISHED)
同時使用-t和-c選項以給進程發送 HUP 信號
[root@node2 ~]# kill -HUP `lsof -t -c nginx`
列出NFS 文件
[root@node2 ~]# lsof -N
列出Unix 套接字文
[root@node2 ~]# lsof -U
eg:
lsof `which httpd` //那個進程在使用apache的可執行文件
lsof /etc/passwd //那個進程在占用/etc/passwd
lsof /dev/hda6 //那個進程在占用hda6
lsof /dev/cdrom //那個進程在占用光驅
lsof -c sendmail //查看sendmail進程的文件使用情況
lsof -c courier -u ^zahn //顯示出那些文件被以courier打頭的進程打開,但是并不屬于用戶zahn
lsof -p 30297 //顯示那些文件被pid為30297的進程打開
lsof -D /tmp 顯示所有在/tmp文件夾中打開的instance和文件的進程。但是symbol文件并不在列
lsof -u1000 //查看uid是100的用戶的進程的文件使用情況
lsof -utony //查看用戶tony的進程的文件使用情況
lsof -u^tony //查看不是用戶tony的進程的文件使用情況(^是取反的意思)
lsof -i //顯示所有打開的端口
lsof -i:80 //顯示所有打開80端口的進程
lsof -i -U //顯示所有打開的端口和UNIX domain文件
lsof -i UDP@[url]www.akadia.com:123 //顯示那些進程打開了到www.akadia.com的UDP的123(ntp)端口的鏈接
lsof -i tcp@ohaha.ks.edu.tw:ftp -r //不斷查看目前ftp連接的情況(-r,lsof會永遠不斷的執行,直到收到中斷信號,+r,lsof會一直執行,直到沒有檔案被顯示,缺省是15s刷新)
lsof -i tcp@ohaha.ks.edu.tw:ftp -n //lsof -n 不將IP轉換為hostname,缺省是不加上-n參數
- 前言
- 讀者須知
- 第一章 Linux
- HTTP
- 簡介
- 狀態碼
- 特點
- URL
- Request
- Response
- 請求方式
- 工作原理
- 生命周期
- GET和POST區別
- 組成
- 端口
- 命令
- 常用命令
- chmod命令詳解
- ubuntu apt-get命令
- 用戶和用戶組
- Nginx
- 四個基本功能
- 進程
- 進程管理[ps命令]
- 進程管理[top命令]
- 進程管理[kill命令]
- 進程管理[進程優先級]
- 進程管理[netstat命令]
- 定時任務
- crontab
- 實現每秒執行
- >/dev/null 2>&1說明
- 文件管理
- 工作管理
- 資源管理
- 第二章 NGINX
- 介紹
- 入門
- 特性
- 安裝啟動
- 基礎必會
- 常用功能
- 反向代理
- 負載均衡
- 正向代理
- HTTP服務器
- 動靜分離
- 技能點匯總
- 顯示亂碼
- 打開目錄瀏覽功能
- 錯誤碼原因和解決方案
- location用法
- 常用正則
- rewrite
- 全局變量
- if語句塊
- https
- php后端處理(fast-cgi)
- flag標志位
- 過期功能
- gzip壓縮
- 會話保持時間
- 配置nginx worker進程最大打開文件數
- sendfile
- 單個工作進程的最大連接數
- 選擇事件驅動模型
- 隱藏ngxin版本號
- 網絡連接的優化
- 緩存原理及機制
- 限流
- 日志配置
- 灰度發布
- 配置一鍵生成
- 第三章 MySQL
- 入門
- 簡介
- 術語
- 特點
- 三范式
- 8.0 新特性
- 數據類型
- 數據類型詳解
- 常用函數
- 命令速查
- MyISAM與InnoDB區別
- 服務器構成
- 事務
- 本質
- 特性
- 分類
- 隔離級別
- PHP中使用事務實例
- MVCC
- 問題和解決
- 調優原則
- 分布式事務
- 索引
- 簡介
- 索引的分類
- 創建索引
- 刪除索引
- 哈希索引
- btree索引和hash索引的區別
- 單列索引和多列索引
- 索引優化
- 查看SQL語句對索引的使用情況
- 鎖
- 技能點
- 開發規范
- 導入導出數據庫
- blob和text的區別
- char與varchar類型區別
- SQL查詢語句優化
- 事務隔離和鎖操作需要在語言級別來做嗎
- 58到家數據庫30條軍規解讀
- 數據遷移
- SKU數據庫設計
- RBAC數據庫設計
- 第四章 Redis
- 入門
- 簡介
- 應用場景
- 安裝啟動
- 生命周期
- 事務
- 配置項
- 緩存
- 數據持久化
- 安全
- 數據類型
- string
- hash
- list
- set
- zset
- php代碼實戰
- 字符串緩存實戰
- 隊列實戰
- 發布訂閱實戰
- 計數器實戰
- 排行榜實戰
- 字符串悲觀鎖實戰
- 事務的樂觀鎖實戰
- 高級應用
- 分片機制
- 主從復制
- 緩存問題
- 解決 Redis 并發競爭 Key 問題
- 淘汰策略
- 第五章 PHP
- composer
- 什么是composer
- composer常用概念解析
- 使用composer的正確姿勢
- 消息隊列
- 為何使用消息隊列
- Beanstalkd
- PSR規范
- PSR-0
- PSR-1
- PSR-2
- PSR-3
- PSR-4
- OOP基礎
- 面向對象概念
- 類和對象
- 類
- 操作對象成員
- this使用
- 構造方法和析構方法
- 封裝
- __set(),__get(),__isset(),__unset()四個方法的應用
- 繼承
- 重載新的方法(parent::)
- 訪問類型(public,protected,private)
- final關鍵字的應用
- static和const關鍵字的使用(self::)
- static關鍵字
- __toString()方法
- 克隆對象__clone()方法
- __call()處理調用錯誤
- 抽象方法和抽象類(abstract)
- 接口(interface)
- 多態
- 把對象串行化serialize()方法,__sleep()方法,__wakeup()方法
- 自動加載類 __autoload()函數
- OOP進階
- 語法糖
- 異常處理
- 后期靜態綁定
- 后期靜態綁定在框架的運用
- 代碼優化思路
- Closure(閉包)
- 巧用PHP內置方法
- 數組操作的奇技淫巧
- 設計模式
- 單例模式(Singleton Pattern)
- 工廠模式(Factor Pattern)
- 建造者模式(Builder Pattern)
- 原型模式(Prototype Pattern)
- 適配器模式(Adapter Pattern)
- 裝飾器模式(Decorator Pattern)
- 代理模式(Proxy Pattern)
- 外觀模式(Facade Pattern)
- 橋接模式(Bridge Pattern)
- 組合模式(Composite Pattern)
- 享元模式 (Flyweight Pattern)
- 策略模式 ( Strategy Pattern )
- 模板模式 (Template Pattern)
- 觀察者模式 (observer Pattern)
- 迭代模式(Iterator Pattern)
- 責任鏈模式(Chain of Responsibility Pattern)
- 命令模式 (Command Pattern)
- 備忘錄模式(Memento Pattern)
- 狀態模式 (State Pattern)
- 訪問者模式(Visitor Pattern)
- 中介者模式(Mediator Pattern)
- 解釋器模式(Interpreter Pattern)
- 數據映射模式(Data Mapper Pattern)
- 注冊樹模式(Registry Pattern)
- 空對象模式(Null Object Pattern)
- 搜索引擎
- Elasticsearch
- 安裝
- 入門
- 實踐
- 集群
- 查詢
- API
- 接口調用
- cURL
- Guzzle
- RPC
- yar
- session
- 概念
- 客戶端實現形式
- cookie與session的區別
- Cookies的安全性
- JWT
- 組成
- 入門
- 應用
- 知識點
- 常見
- $_SERVER
- php的引用
- 第六章 技術棧擴展
- 使用第三方靜態資源服務
- 七牛對象存儲實戰
- 七牛對象存儲之客戶端上傳
- aliyunOSS服務端文件上傳
- aliyunOSS客戶端文件上傳
- 第三方支付
- 微信支付
- 支付寶支付
- SEO排名影響因素
- PHP架構師之路
- CTO職能
- web宏觀分析
- 常見的企業軟件系統
- 負載的優化思路
- 從容應對負載并發的前期準備
- 第七章 網絡安全
- XSS
- CSRF
- DDoS
- SQL注入
- 停用js
- 文件上傳
- 點擊劫持
- APT
- 會話劫持
- 第八章 運維
- devops
- devops簡介
- 常用工具
- 搭建運行環境
- Centos7 lnmp環境搭建
- ubuntu lnmp環境搭建
- Apache多站點配置
- docker
- 輕松使用和理解docker
- lnamp產品級環境搭建
- lnamp產品級環境搭建【第二版】
- 基于 Docker 容器的沙盒化評測系統
- vagrant
- vagrant入門
- vagrant之Vagrantfile
- vagrant之集成jenkins
- homestead
- gitlab
- gitlab簡介
- webhook
- ssh堡壘機
- 第九章 測試
- 壓力測試
- 單元測試
- 第十章 團隊協作
- 軟件開發模式
- 邊做邊改模型
- 瀑布模型
- 迭代模型
- 快速原型模型
- 增量模型
- 螺旋模型
- 敏捷軟件開發
- 演化模型
- 噴泉模型
- 智能模型
- 混合模型
- 模型對比
- TDD
- git
- git_入門
- git_使用
- git_進階
- git workflow
- git_高級
- git_小技巧
- okr工作法
- API接口文檔管理系統
- 敏捷協作工具
- 第十一章 技術燈塔
- github項目
- 社區好貨
- 紙質書
- 第十二章 代碼之外
- 面試官的角度看面試
- 程序員的壯年思考