Raid级别
RAID(Redundent Array of Inexpensive Disks),廉价冗余磁盘阵列,后来RAID中的I被改作了Independent,就成了“独立冗余磁盘阵列”,但这只是名称的变化,实质性的内容并没有改变。可以把RAID理解成一种使用磁盘驱动器的方法,它将一组磁盘驱动器用某种逻辑方式联系起来,作为逻辑上的一个磁盘驱动器来使用。 ...
RAID(Redundent Array of Inexpensive Disks),廉价冗余磁盘阵列,后来RAID中的I被改作了Independent,就成了“独立冗余磁盘阵列”,但这只是名称的变化,实质性的内容并没有改变。可以把RAID理解成一种使用磁盘驱动器的方法,它将一组磁盘驱动器用某种逻辑方式联系起来,作为逻辑上的一个磁盘驱动器来使用。 ...
监控指标 load 特定事时间间隔内运行队列中的平均线程数 user time CPU执行用户进程所占用的时间 system time CPU在内核所花费的时间 nice time 系统在调整进程优先级的时候所花费的时间 idle time 系统空闲等待进程运行的时间 waiting time CPU在等待IO操作所花费的时间 hard irq time 系统处理硬件中断所占用的时间 soft irq time 系统处理软件中断所占用的时间 steal time 被强制等待虚拟机CPU的时间,占比较高表示当前虚拟机与该宿主其他虚拟机争用CPU频繁 磁盘剩余空间 使用df和du命令查看 网络traffic 使用sar命令查看 sar -n DEV 1 1 磁盘IO 使用iostat命令查看 iostat -d -k 内存使用 使用free命令查看 swap IO 使用vmstat命令查看 CPU 使用top或uptime看过去1分钟、5分钟、15分钟机器的负载。按照经验,若数值小于 0.7 * CPU核数,则系统工作正常 通过vmstat查看CPU上下文切换次数, 上下文切换的场景: 时间片用完,CPU正常调度下一个任务 被其它优先级更高的任务抢占 执行任务碰到I/O阻塞,挂起当前任务,切换到下一个任务 户代码主动挂起当前任务让出CPU 多任务抢占资源,由于没有抢到被挂起 硬件中断 Memory 操作系统角度,内存关注应用进程是否足够,可以使用free –m查看内存的使用情况。 通过top查看进程使用的虚拟内存VIRT和物理内存RES,根据公式VIRT = SWAP + RES可以推算出具体应用使用的交换分区(Swap)情况 I/O I/O包括磁盘I/O和网络 I/O,一般情况下磁盘更容易出现I/O瓶颈。 通过iostat可查看磁盘的读写情况,通过CPU的I/O wait可以看出磁盘I/O是否正常。 System Call strace常用来跟踪进程执行时的系统调用和所接收的信,常见选项: ...
文件I/O常用函数 open 打开或创建一个文件 create 创建一个新文件 read 从打开文件中读取数据 write 向打开文件中写入数据 lseek 显示设置文件的偏移量 close 关闭一个文件 文件描述符 对于内核而言,所有打开的文件都通过文件描述符引用,它是一个非负数,打开或新建文件时内核向进程返回一个文件描述符,当读写一个文件时,使用oepn或create返回文件描述符标识文件,并将其作为参数传给read或write。 ...
select 模型 下面是 select 函数接口: int select (int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); select 函数监视的文件描述符分 3 类,分别是 writefds、readfds 和 exceptfds。调用后 select 函数会阻塞,直到有描述符就绪(有数据 可读、可写、或者有 except),或者超时(timeout 指定等待时间,如果立即返回设为 null 即可)。当 select 函数返回后,通过遍历 fd_set,来找到就绪的描述符。 select 目前几乎在所有的平台上支持,其良好跨平台支持是它的一大优点。select 的一个缺点在于单个进程能够监视的文件描述符的数量存在最大限制,在 Linux 上一般为 1024,可以通过修改宏定义甚至重新编译内核的方式提升这一限制,但是这样也会造成效率的降低。 poll 模型 int poll (struct pollfd *fds, unsigned int nfds, int timeout); 不同与 select 使用三个位图来表示三个 fdset 的方式,poll 使用一个 pollfd 的指针实现。 ...
进程和CPU信息 参数 含义 load average: 0.06, 0.60, 0.48 系统负载,即任务队列的平均长度,1分钟、5分钟、15分钟前到现在的平均值, 按照经验小于0.7 x cpu核数则正常 Tasks: 29 total 进程总数 1 running 正在运行的进程数 28 sleeping 睡眠的进程数 0 stopped 停止的进程数 0 zombie 僵尸进程数 Cpu(s): 0.3% us 用户空间占用CPU百分比 1.0% sy 内核空间占用CPU百分比 0.0% ni 用户进程空间内改变过优先级的进程占用CPU百分比 98.7% id 空闲CPU百分比 0.0% wa 等待输入输出的CPU时间百分比 0.0% hi CPU服务于硬中断所耗费的时间总额 0.0% si、0.0%st CPU服务于软中断所耗费的时间总额、Steal Time 内存信息 参数 含义 Mem: 191272k total 物理内存总量 173656k used 使用的物理内存总量 17616k free 空闲内存总量 22052k buffers 用作内核缓存的内存量 Swap: 192772k total 交换区总量 0k used 使用的交换区总量 192772k free 空闲交换区总量 123988k cached 缓冲的交换区总量,内存中的内容被换出到交换区,而后又被换入到内存,但使用过的交换区尚未被覆盖, 该数值即为这些内容已存在于内存中的交换区的大小,相应的内存再次被换出时可不必再对交换区写入 进程统计信息 参数 含义 PID 进程id PPID 父进程id RUSER Real user name UID 进程所有者的用户id USER 进程所有者的用户名 GROUP 进程所有者的组名 TTY 启动进程的终端名.不是从终端启动的进程则显示为 ? PR 优先级 NI nice值.负值表示高优先级,正值表示低优先级 P 最后使用的CPU,仅在多CPU环境下有意义 %CPU 上次更新到现在的CPU时间占用百分比 TIME 进程使用的CPU时间总计,单位秒 TIME+ 进程使用的CPU时间总计,单位1/100秒 %MEM 进程使用的物理内存百分比 VIRT 进程使用的虚拟内存总量,单位kb,VIRT=SWAP+RES SWAP 进程使用的虚拟内存中,被换出的大小,单位kb. RES 进程使用的、未被换出的物理内存大小,单位kb,RES=CODE+DATA CODE 可执行代码占用的物理内存大小,单位kb DATA 可执行代码以外的部分(数据段+栈)占用的物理内存大小,单位kb SHR 共享内存大小,单位kb nFLT 页面错误次数 nDRT 最后一次写入到现在,被修改过的页面数. S 进程状态: D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程 COMMAND 命令名/命令行 WCHAN 若该进程在睡眠,则显示睡眠中的系统函数名 Flags 任务标志,参考 sched.h
内置变量 $0 脚本名称 $n 传给脚本/函数的第n个参数 $$ 脚本的PID $! 上一个被执行的命令的PID(后台运行的进程) $? 上一个命令的退出状态(管道命令使用${PIPESTATUS}) $# 传递给脚本/函数的参数个数 $@ 传递给脚本/函数的所有参数(识别每个参数) $* 传递给脚本/函数的所有参数(把所有参数当成一个字符串) 调试 # 抓包 tcpdump -i eth2 -w capture.cap tcp port 9501 and dst host 172.16.1.31 # 跟踪系统调用 strace -o strace.log -tt -f -e {call} -p {pid} # 开启coredump Mac下的cordump文件不在当前运行目录下,而是在系统指定目录,通常是/cores ulimit -c unlimited # 查看MTU cat /sys/class/net/eth0/mtu # -s 包的大小,Specifies the number of data bytes to be sent. ping -c 3 -s 2900 -M do 172.168.0.2 用户 # 新增用户 useradd user1 # 设置密码 passwd user1 # 新建用户组 groupadd group1 # 用户组新增用户 gpasswd -a user1 group1 # 修改目录所有者 chown -R user1:group1 dir1 文本处理 # 遍历查找当前目录下同时包含xxx和yyy的行 grep -r "xxx" . | grep "yyy" # 遍历查找当前目录下包含xxx或者yyy的行 grep -r . -e "xxx" -e "yyy" # 遍历查找当前目录下包含xxx但不包含yyy的行 grep -r "xxx" . | grep -v "yyy" # 查处字符串出现次数 grep -o "xxx"|wc -l # 显示file文件中匹配foo字串那行以及上下5行 grep -C 5 foo file # 显示foo及前5行 grep -B 5 foo file # 显示foo及后5行 grep -A 5 foo file # 匹配行带文件名,以下命令会返回类似结果结果:file1:hello file2:hhhhello grep -H hello file* # 查找7天内没访问过的文件 find path -atime +7 # 查找7天内访问过的文件 find path -atime -7 # 表示在当前目录及其子目录下查找普通文件中包含abc字符串的文件行,经常用于搜索代码 find . -type f|xargs grep 'abc' # 清理文件 find 路径 -name "*.log.*" -mtime +1 -delete # 从备份中的日志查询数据 bzcat xx.log.bz2 | grep "xxxx" bzgrep "xxxx" xx.log.bz2 # 消除重复行 sort unsort.txt | uniq # 统计各行在文件中出现的次数 sort unsort.txt | uniq -c # 找出重复行 sort unsort.txt | uniq -d # 统计行数,单词数,字符数 wc -[l][w][c] file # 清空文件,文件空间会立刻释放 echo "" > a.log # awk 转义需要两个反斜杆 awk -F'url\\[' '{print $2}' 磁盘管理 # 查看当前目录所占空间大小 du -sh # 查看当前目录下所有子文件夹排序后的大小: du -sh `ls` | sort # 查看当前正在写磁盘的进程id信息 iotop -o 进程管理 # 查看8080端口 lsof -i:8080 # 查看占用8080端口的进程 netstat -pan|grep 8080 # 查看用户username的进程所打开的文件 lsof -u username # 查询nginx进程当前打开的文件 lsof -c nginx # 查询指定的进程ID(23295)打开的文件: lsof -p 23295 # 查看打开文件数最多的10个进程 lsof +c 10 | awk '{print $1}' | sort | uniq -c | sort -rn | head 性能监控 # 查看页面交换发生状况 页面发生交换时,服务器的吞吐量会大幅下降,通常是内存不足导致,每秒采样1次,共采样3次 # sar不可用时,可以使用以下工具替代:linux下有 vmstat、Unix系统有prstat sar -W 1 3 # Linux上的ss命令可以用于替换netstat,ss直接读取解析/proc/net下的统计信息,相比netstat遍历/proc下的每个PID目录,速度快很多 ss -t -a 显示所有的TCP Sockets ss -u -a 显示所有的UDP Sockets ss -x src /tmp/a.sock 显示连接到/tmp/a.sock的进程 ss -o state [state TCP-STATE] 如ss -o state established显示所有建立的连接 系统信息 # 总核数 = 物理CPU个数 X 每颗物理CPU的核数 # 总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的核数 X 超线程数 # 查看物理CPU个数 cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l # 查看每个物理CPU中core的个数(即核数) cat /proc/cpuinfo| grep "cpu cores"| uniq # 查看逻辑CPU的个数 cat /proc/cpuinfo| grep "processor"| wc -l 定时任务 格式:分钟[0-59] 小时[1-23] 日期[1-31] 月份[1-12] 星期[0-6] ...
Cgroup 计算资源 内存资源 IO资源 网络资源 进程 具有独立功能的程序,关于某个数据集合的一次运行过程 进程 = 程序 + 数据+ PCB 3个基本状态:ready(就绪等cpu)/running(运行)/waiting(等待事件的发生) PCB:进程存在的唯一标志 调度:状态转换时发生调度,IO密集型/CPU密集型,进程树,overhead(系统消耗) IPC:管道/共享内存(生产者/消费者)/消息传递(send/recv)/信号量/套接字,busy waiting CPU调度 FCFS(First-Come First-Served) SJF(Shortest-Job-First),preemptive(抢占式) Priority Scheduling Round Robin Multilevel Queue Scheduling Multilevel Feedback Queues 进程同步 entry section, critical section, exit section, remainder section 临界区使用原则:互斥(忙则等待),空闲让进,有限等待,让权等待 semaphore: wait()用于申请资源, signal()用于释放资源 生产者消费者问题,读者写者问题,哲学家进餐问题 管程 进程间通信 管道 文件和文件锁 共享内存 信号量 消息队列 死锁 两个或两个以上的进程由于竞争资源导致系统无法推进 产生必要条件:互斥,占有必等待,非抢占,循环等待 银行家算法(allocation,max,available) 内存管理 swapping, paging, segmentation 单CPU需要两个寄存器(基础+界限) 逻辑地址 物理地址 重定位寄存器 连续分配:固定分区,可变分区 离散分配:分页(页=>页框),分段,段页 虚拟存储 demand paging page replacement allocation of frames thrashing(抖动) 监控指标 load 特定事时间间隔内运行队列中的平均线程数 user time CPU执行用户进程所占用的时间 system time CPU在内核所花费的时间 nice time 系统在调整进程优先级的时候所花费的时间 idle time 系统空闲等待进程运行的时间 waiting time CPU在等待IO操作所花费的时间 hard irq time 系统处理硬件中断所占用的时间 soft irq time 系统处理软件中断所占用的时间 steal time 被强制等待虚拟机CPU的时间,占比较高表示当前虚拟机与该宿主其他虚拟机争用CPU频繁 磁盘剩余空间 使用df和du命令查看 网络traffic 使用sar命令查看 sar -n DEV 1 1 磁盘IO 使用iostat命令查看 iostat -d -k 内存使用 使用free命令查看 swap IO 使用vmstat命令查看 同步异步阻塞非阻塞 同步与异步关注的是消息通信机制 (synchronous communication/ asynchronous communication) 阻塞与非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态,主要是从CPU消耗上来说的 同步阻塞 最常用,IO性能较差,CPU大部分处于空闲 同步非阻塞 在网络IO是长链接且传输数据较小时可以有效提升性能 异步阻塞 在分布式数据库中常用,写一份记录通常会有一个是同步阻塞,而其他几份会采用异步阻塞方式写入其他机器 异步非阻塞 比较复杂,通常在集群间同步消息使用,例如cassandra,适合同时要传多份相同数据到不同机器,数据量不大但是异常频繁 僵尸进程与孤儿进程 在unix/linux中,正常情况下,子进程是通过父进程创建的,子进程再创建新的进程。子进程的结束和父进程的运行是一个异步过程,即父进程永远无法预测子进程到底什么时候结束。 当一个进程完成它的工作终止之后,它的父进程需要调用wait()或者waitpid()系统调用取得子进程的终止状态。 ...