学习总结:Linux系统管理

一、进程管理

1. 进程管理的作用

  • 判断服务器健康状态
  • 查看系统中所有进程
  • 杀死进程

2. 进程的查看–ps和pstree命令

  • 查看系统中所有进程,使用BSD操作系统格式
ps aux 
  • 查看系统中所有进程,使用linux标准命令格式
ps -le

选项: -a:显示一个终端的所有进程,除了会话引线 -u:显示进程的归属用户及内存的使用情况 -x:显示没有控制终端的进程 -l:长格式显示 -e:显示所有进程,和-A作用一致

  • ps命令进程输出的说明:
    • USER:该进程是由哪个用户产生的
    • PID:进程的ID号
    • %CPU:该进程占用的CPU资源的百分比,占用越高,进程越消耗资源
    • %MEM:该进程占用物理内存的百分比,占用越高,进程越消耗资源
    • VSZ:该进程占用虚拟内存的大小,单位KB
    • RSS:该进程占用实际物理内存的大小,单位KB
    • TTY:该进程是在哪个终端中运行的,其中tty1-tty7代表本地控制台终端,tty1-tty6代表本地的字符界面终端,tty7是图形终端,pts/0-255代表虚拟终端。
    • STAT:进程状态:
      • R:运行
      • S:睡眠
      • T:停止状态
      • s:包含子进程
      • +:位于后台
    • START:该进程的启动时间
    • TIME:该进程占用CPU的运算时间,注意不是系统时间
    • COMMAND:产生此进程的命令名

  • 查看进程树
pstree

选项:

  • -p:显示进程的PID
  • -u:显示进程的所属用户

3. 进程的查看–top命令

top
  • 选项:
    • -d 秒数:指定top命令默认每隔几秒更新,默认是3秒
    • -b:使用批处理模式输出,一般和“-n”选项合用
    • -n 次数:指定top命令执行的次数,一般和-b选项合用
  • 在top命令的交互模式中可以执行的命令:
    • ?或h:显示交互模式的帮助
    • P:以CPU使用率排序,默认就是此项
    • M:以内存的使用率排序
    • N:以PID排序
    • q:推出top
  • top命令前5行的作用:
top - 22:52:38 up  3:41,  1 user,  load average: 0.15, 0.16, 0.23
Tasks: 223 total,   2 running, 221 sleeping,   0 stopped,   0 zombie
%Cpu(s):  9.7 us,  2.8 sy,  0.0 ni, 86.4 id,  1.1 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  3967824 total,   985600 free,  1241660 used,  1740564 buff/cache
KiB Swap:  4115452 total,  4115452 free,        0 used.  2213400 avail Mem 

  • 第一行: 系统当前时间 系统的运行时间 当前登录了几个用户 系统在之前1分钟,5分钟,15分钟的平均负载,一般小于1时,负载较小。如果大于1,系统已经超出负载。
  • 第二行: Tasks: 系统中的进程总数 2 running: 正在运行的进程数 221 sleeping:睡眠的进程 0 stopped:正在停止的进程 0 zombie:僵尸进程,如果不是0,需要手工检查僵尸进程
  • 第三行: %Cpu(s):用户模式占用CPU的百分比 2.8sy:系统模式占用的CPU百分比 0.0ni:改变过优先级的用户进程CPU占用百分比 86.4id:空闲CPU的CPU百分比 1.1wa:等待输入/输出的进程的占用百分比 0.0hi:硬终端请求服务占用的CPU百分比 0.1si:软终端请求服务占用的CPU百分比 0.0st:st(Steal time)虚拟时间百分比,就是当由虚拟机时,虚拟CPU等待实际CPU的时间百分比
  • 第四行: Mem:物理内存的总量,单位KB free:空闲的物理内存数量 userd:已经使用的物理内存数量 buff:作为缓冲的内存数量
  • 第五行: Swap:交换分区(虚拟内存)的总大小 free:空闲交换分区的大小 userd:已经使用的交互分区的大小

    • top只能查看部分进程情况,如果要查看系统中所有进程的CPU占用情况,则可以用以下方式,将结果存于top.log中:
top -b -n 1 > top.log

4. 杀死进程

  • 1.kill命令
    • 查看可用的进程信号
      kill -l
      
    • 重启进程
      kill -1 2235
      
    • 根据进程信号,-1既-HUP:
      kill -HUP 2235
      
    • 强制杀死进程
      kill -9 2235
      
  • 2.killall命令
    • killall [选项][信号]进程名 按照进程名杀死进程 选项: -i :交互式,询问是否杀死某个进程 -I:忽略进程名的大小写
  • 3.pkill命令
    • pkill [选项][信号]进程名 按照进程名杀死进程 选项: -t 终端号:安装终端号踢出用户
    1. 查看当前登录用户,终端号可以这个命令查看
    w
    
    1. 强制杀死从pts/1虚拟终端登录的进程
    pkill -9 -t pts/1
    

5. 修改进程优先级

Linux操作系统是一个多用户多任务的操作系统,linux系统中运行这非常多的进程,但是cpu在同一个时钟周期内只能运算一个指令,进程优先级决定了每个进程处理的先后顺序。

查看优先级可以根据上面的查看进程命令ps -le查看,

  • PRI,NI都表示优先级,其中PRI代表Priority,NI代表Nice,数字越小代表该进程优先级越高。
  • PRI是不能修改的,但用户可以修改NI,但是系统生效的优先级是PRI+NI,所有修改NI可以修改进程的优先级。
  • 修改NI值的几个注意事项:
    • NI值的范围是-20到19
    • 普通用户调整NI的范围是0到19,而且只能调整自己的进程
    • 普通用户只能调高NI值,不能降低
    • root用户才能设定进程NI值位负值,而且可以调整任何用户的进程
    • PRI(最终值)= PRI(原始值) + NI
    • 用户只能修改NI的值,不能直接修改PRI
  • 修改优先级命令:
nice [选项]命令

nice命令可以给新执行的命令直接赋予NI值,但是不能修改已经存在的进程的NI值 选项: -n NI值:给命令赋予NI值

例如将apache服务所有进程优先级改为-5:

nice -n -5 service httpd start
  • 修改已经存在的进程的NI值的命令 例如将PID为2125的进程该为-10: renice -10 2125
renice[优先级] PID

二、工作管理

1. 工作管理简介

工作管理指的是在单个登录终端中同时管理多个工作的行为。类似于在windows中,将程序放在后台运行。

  • 查看后台作业,加-l可以查看进程的PID号 注:结果显示+号表示最近一个放入后台的工作,也是工作恢复时默认恢复的工作,-号代表倒数第二个放入后台的工作
jobs [-l]

2. 工作管理方法

  • 把进程放入后台方式: 1.命令 & : 把命令放入后台,并在后台运行 2.命令执行后 ctrl+z : 放在后台暂停
  • 将后台暂停的工作恢复到前提运行:
fg %工作号

%可以省略,工作号是前面的1,2,3,而不是PID号

  • 将后台暂停的工作恢复到后台运行:
bg %工作号

3. 后台命令脱离终端

命令在后台只在当前终端执行,如果关闭当前终端,后台命令也会关闭,因为终端关闭时其实是给kill -l发送一个信号。而一些服务要脱离终端运行,例如mysql的服务,mysqld这个d是守护进程的意思。

后台程序脱离终端方法:

  • 1.把需要后台执行的命令加入 /etc/rc.local文件
  • 2.使用系统定时任务,让系统在指定的时间执行某个后台任务
  • 2.nohup [命令] &

三、系统资源查看

1.vmstat 监控系统资源

vmstat [刷新延时 刷新次数]
比如:vmstat 1 3  每隔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
 4  0      0 1636132  55736 1163332    0    0   212    86  198  856  8  2 85  6  0
 3  0      0 1632764  55736 1163364    0    0     0     0 1020 7142 19  6 74  1  0
 3  0      0 1630328  55736 1163360    0    0     0     0 1186 6955 17  5 76  1  0

说明:

  • procs:进程信息字段
    • r :等待运行的进程数,数量越大,系统越繁忙
    • b: 不可被唤醒的进程数量,数量越大,系统越繁忙
  • memory:内存信息字段
    • swpd:虚拟内存的使用情况,单位kb
    • free:空闲的内存容量,单位kb
    • buff:缓冲的内存容量,单位kb
    • cache:缓存的内存容量,单位kb
  • swap:交换分区的信息字段
    • si:从磁盘中交换到内存中数据的数量,单位kb
    • so:从内存中交换到磁盘中数据的数量,单位kb 此两个数越大,说明数据需要经常在磁盘和内存之间交换,系统性能越差
  • io:磁盘读写信息字段
    • bi:从块设备读入数据的总量,单位是块
    • bo:写到块设备的数据的总量,单位是块 此两个数越大,代表系统的I/O越繁忙
  • system:系统信息字段
    • in:每秒被中断的进程次数
    • cs:每秒进行的事件切换次数,此两个数越大,代表系统与接口设备的通信非常繁忙
  • CPU: cpu信息字段
    • us:非内核进程消耗cpu运算时间的百分比
    • sy:内核进程消耗cpu运算时间的百分比
    • id:空闲cpu的百分比
    • wa:等待I/0所消耗的cpu百分比
    • st:被虚拟机所盗用的cpu百分比

缓存cache:用来加速数据从硬盘中读取 缓冲buffer:加速数据写入

2.dmesg开机时内核检测信息

dmesg
dmesg | grep CPU

3.free命令查看内存使用状态

free [-b|-k|-m|-g]

选项:

  • -b:以字节为单位显示
  • -k:以kb为单位显示,默认
  • -m:以MB为单位显示
  • -g:以GB为单位显示

4.查看cpu的信息

cat /proc/cpuinfo

5. uptime 命令

uptime

显示系统的启动时间和平均负载,也就是top命令的第一行,w命令也可以看到这个数据

5. 查看系统与内核相关信息

uname [选项]

选项:

-a:查看系统所有相关信息
-r:查看内核版本
-s:查看内核名称

6. 查看操作系统的位数:

随便打开一个外部命令,看这个命令是几位,则操作系统的位数,如:

file /bin/ls

7. 查询当前linux系统的发行版

lsb_release -a

对比上面的查看内核版命令:uname -r

8. 列出进程打开或使用的文件信息

lsof [选项]

选项:

-c 字符串: 只列出以`字符串`开头的进程打开的文件
-u 用户名:只列出某个用户的进程打开的文件
-p pid:列出某个pid进程打开的文件

如:

lsof | more 查看系统中所有进程调用的文件
lsof /sbin/init 查询某个问被哪个进程调用
lsof -c httpd 查看httpd进程调用了哪些文件
lsof -u root 按照用户名,查询某用户的进程调用的文件名

四、系统定时任务

1. at一次执行

at服务是否安装

chkconfig --list | grep atd

at服务的状态

service atd status

at服务的启动

service atd restart 

at [选项]时间

  • 选项: -m:当at工作完成后,无论是否命令有输出,都用email通知执行at命令的用户 -c 工作号:显示该at工作的实际内容
  • 时间: HH:MM 例如:03:30 HH:MM YYYY-MM-DD 例如:03:30 2016-07-15 HH:MM[am|pm][month][date] 例如:02:30 July 25 HH:MM[am|pm] + [minutes|hours|days|weeks] 例如:now+5 minutes

查询当前服务器上的at工作:

atq

删除指定的at任务:

atrm [工作号]

2. crontab循环定时任务

service crond restart
chkconfig crond on

crontab [选项] 选项:

-e:编辑crontab定时任务
-l: 查询crontab任务
-r:删除当前用户所有的crontab任务

3.系统的crontab设置

执行系统的定时任务的方法:

  • 手工执行定时任务
  • 系统定时任务:
    • 第一种是把需要定时执行的脚本复制到/etc/cron.{daily,weekly,monthly}目录中的任意一个。
    • 第二种是修改 /etc/crontab配置文件

4. anacron配置及总结

anacron是用来保证在系统关机的时候错过的定时任务,可以在开机之后再执行。

  • anacron会使用一天,七天,一个月作为检测周期
  • 在系统的/var/spool/anacron/目录中存在cron.{daily,weekly,monthly}文件,用于记录上次执行cron的时间
  • 和当前时间做比较,如果两个时间的差值超过了anacron指定的时间差值,证明有cron任务被执行
  • 配置文件:
vim /etc/anacrontab

学习总结:如何设计良好的数据库

数据库设计的概念

一个应用系统需要存放数据,那么我们就需要考虑用什么数据库,建几张表,表与表之间的关系是什么,每张表有多少字段,每个字段有什么特性,比如:数据类型、数据长度、数据约束(主外键、唯一约束、非空约束等)、数据索引等。

良好的设计和糟糕的设计

良好的设计:

  • 可以减少数据库的冗余
  • 尽可能的避免数据异常
  • 解决存储空间
  • 可以达到高效的访问

糟糕的设计:

  • 存在大量数据冗余
  • 存在数据插入,更新,删除异常
  • 浪费大量存储空间
  • 访问数据低效

数据库设计的步骤

  1. 需求分析:根据数据的属性和特点设置数据类型
  2. 逻辑设计:实现数据库的逻辑建模和数据关系(ER图)
  3. 物理设计:考虑具体的需求来选择合适的数据管理系统
  4. 维护优化:考虑表结构的建立、索引优化、大表拆分等

一、需求分析

我们接到一个项目,一般会进行以下的分析:

  1. 首先要去分析这个项目有哪些模块
  2. 然后针对具体模块分析有哪些属性
  3. 针对属性分析哪个属性或哪几个属性的集合可以用来作为[唯一标识]
  4. 分析这个模块数据是否永久存储,是否数据增长很快,是否经常查询
  5. 如果就要考虑分库分表了
  6. 如果不是,那么这些数据是否只会存储一定时间,是否需要永久记录
  7. 如果需要永久记录,我们就定期归档及数据的迁移操作

二、逻辑设计

1. 逻辑设计的工作

  • 将需求转化为数据库的逻辑模型
  • 通过ER图的形式对逻辑模型进行展示
  • 逻辑设计同所选用的具体的数据库管理系统无关

2. 数据库设计范式

数据库设计范式概念:是一些设计数据库的良好的规则或者经验。常见的数据库设计设计包括:第一范式、第二范式、第三范式

  • 【第一范式】: 数据库中的所有字段都是单一属性,不可再分的。这个单一属性是由基本的数据类型所构成的,如整数,浮点娄,字符串等。第一范式要求数据库中的表都是二维表。
  • 【第二范式】 数据库中的表中不存在非关键字段对任一候选关键字段的部分函数依赖。 部分函数依赖是指存在着组合关键字中的某一关键字决定非关键字的情况。 换名话说:所有单关键字段的表都符合第二范式。
  • 【第三范式】 第三范式是在第二范式的基础之上定义的。如果数据表中不存在非关键字段对任意候选关键字段的传递函数依赖则符合第三范式。 第三范式存在的问题:存在数据冗余;存在数据插入、更新和删除异常
  • 【BCNF范式(Boyce.Codd范式)】 在3范式基础上,数据库表中如果不存在任何字段对任一候选关键字段的传递函数依赖则符合BC范式。也就是说如果是复合关键字,则复合关键字之间也不能存在函数依赖关系。

三、物理设计

1. 物理设计要做什么

  • 选择合适的数据库管理系统: oracle、sqlserver、mysql、PgSQL
  • 定义数据库、表以及字段的命名规范
  • 根据所选的dbms系统选择合适的字段类型
  • 反范式化设计

2. 选择哪种数据库

  • 商业数据库:oracle sqlserver 要考虑对应的成本,版权的费用
  • 开源数据库:mysql、 pgsql 考虑对应的效率,对应的系统,开发所使用的语言
  • 商业数据库更适合企业级项目, 开源数据库适用于互联网系统
  • Mysql常用存储引擎:
存储引擎 事务 锁粒度 主要应用 忌用
MyISAM 不支持 支持并发插入的表级锁 select,insert 读写操作频繁
MRG_MYISAM 不支持 支持并发插入的表级锁 分段归档,数据仓库 全局查找过多的场景
Innodb 支持 支持MVCC的行级锁 事务处理
Archive 不支持 行级锁 日志记录,只支持insert,select 需要随机读取、更新、删除
Ndb cluster 支持 行级锁 高可用性 大部分应用

3. 表及字段命名规则

  • 可读性原则(使用大小写来格式化的库对象名以获得良好的可读性)
  • 表意性原则(对象的名字应该能描述出它所标识的的对象)
  • 长名原则(尽可能少使用或不适用缩写)

4.字段选择类型的原则

基本原则 :
列的数据类型一方面影响数据存储空间的开销,另一方面也会影响数据查询的性能。当一个列可以选择多种数据库类型时,应该优先考虑数字类型,其次是日期或二进制类型,最后是字符类型。对于相同级别的数据类型,应该优先选择占用空间小的数据类型。

  • 在对数据进行比较(查询条件、JOIN条件及排序)操作时,同样的数据,字符处理往往比数字处理慢。
  • 在数据库中,数据处理以页为单位,列的长度越小,利于性能提升。

5. 如何具体选择字段类型

char与varchar的选择:
  • 如果列中要存储的数据程度差不多是一致的,则应该考虑用char,否则应该考虑用varchar
  • 如果列中的最大长度小于50byte,则一般先要考虑char
  • 一般不定义大于50byte的char类型列。
decimal与float 如何选择
  • decimal用于存储精确数据,而float只能用于存储非精度数据。
  • 由于float的存储空间开销一般比demimal小。(精确到7位小数只需要4个字节,而精确到15位小数只需要8个字节),故非精度数据优先选择float
时间类型如何存储
  • 使用int来存储时间字段的优缺点
    优点:字段长度比datetime小
    确定:使用不方便,要进行函数转换。
    限制:只能存储到2038-1-19 11:14:07即是2的32次方为2147483648
  • 需要存储的时间粒度
    年月日小时分秒周

6. 数据库设计的注意事项

如何选择主键

1.区分业务主键和数据库主键
业务主键用于标识业务数据,进行表与表之间的关联。
数据库主键为了优化数据存储

2.根据数据库的类型,考虑主键是否要顺序增长
有些数据库是按主键的顺序逻辑存储的

3.主键的字段类型所占用空间要尽可能的小
对于使用聚集索引方式的存储的表,每个索引后都会附加主键的信息

避免使用外键约束
  • 降低数据导入的效率
  • 增加维护成本
  • 虽然不建议使用外键约束,但是相关联的列上一定要建立索引。
避免使用触发器
  • 降低数据导入的效率
  • 可能会出现意想不到的数据异常
  • 使业务逻辑变的复杂。
关于预留字段
  • 无法准确的知道预留字段的类型
  • 无法准确的知道预留字段中所存储的内容
  • 严禁使用预留字段

7. 反范式化表设计

反范式化设计就是为了性能和读取效率的考虑而适当的对第三范式的要求进行违反,而允许存在少量的数据冗余,换句话来说反范式化就是使用空间来换取时间。
好处:减少表的关联数量、增加数据的读取效率、反范式化一定要适度

四、维护优化

1. 维护优化要做什么

  • 数据字典记录表中每个列所存储的内容是什么,方便后期维护和升级,特别是一些状态字段
  • 索引的维护,主要是从一个动态变化的角度来看待我们的数据和索引
  • 数据表中存在过时的字段,需要清理
  • 当表中的数据量达到一个数量级的话,影响查询的速度,需要对表进行适当的拆分

2. 如何维护数据字典

  • 使用第3方工具对数据字典进行维护(ORACLE PL/SQL, ORACLE TOAD…)
  • 利用数据库本身的备注字段来维护数据字典:
 //MYSQL为例:
CREATE TABLE Customer(cust_id in auto_increment not null comment ‘自增ID’, cust_name varchar(10) not null comment ‘客户姓名’, primary key(cust_id)) comment ‘客户表’
//导出数据字典(MYSQL数据字典案例:
select a.table_name, b.table_comment, a.column_name, a.column_type, a.column_comment from INFORMATION_SCHEMA.COLUMNS a join INFORMATION_SCHEMA.TABLES b on a.table_schema = b.table_schema and a.table_name = b.table_name where a.table_name = ‘customer’;

3. 如何维护索引

  • 出现在WHERE从句,GROUP BY从句,ORDER BY从句中的列
  • 可选择性高的列要放到索引的前面
  • 索引中不要包括太长的数据类型

【注意事项】:
– 索引不是越多越好,过多的索引不但会降低写效率而且会降低读的效率
– 定期维护索引碎片
– 在SQL语句中不要使用强制索引关键字

4. 数据库中适合的操作

维护表结构注意事项:

  • 使用在线变更表结构工具:
    MYSQL5.5之前可以使用 pt-online-schema-change
    MYSQL5.6之后本身支持在线表结构的变更
  • 同时对数据字典进行维护
  • 控制表的宽度和大小(表字段的大小控制,表数据量的分区,拆分处理等)
  • 禁止使用SELECT *这样的查询(把不必要的字段也查询出来,浪费IO)
  • 控制使用用户自定义函数(索引失效)
  • 不要使用数据库中的全文索引

5. 表的垂直拆分和水平拆分

  • 垂直拆分:解决宽度的问题
  • 水平拆分:解决数据量的问题

垂直拆分:当表的列过多,几十列等等,这是查询该表的IO速度会变慢,这是就建议进行垂直拆分,即拆分列,为了控制表的宽度。
– 经常一起查询的列放到一起
– TEXT, BLOB等大字段拆分到附加表中

水平拆分:表的水平拆分就是为了控制表的大小,也就是说,把一张大表里面的数据分配到其它几张相同的表中,这样就可以减少一张表里面存储的数据。一般采用的是哈希(hash key)的方式。