[toc]
进程调度
OS:硬件抽象,虚拟计算机
system call
CPU: time slice
获得CPU权限的优先级,有些进程的优先级是可以被提高的
调度器(本身也是个程序): CFS Big O
O(1) 一个算法的时间复杂度
0-139
0-99
100-139:
nice
Memory:
虚拟地址空间
PAE:物理地址扩 32bits,寻址的物理空间是4G,4bits是额外引入的,所以被称为PAE技术(64G)
也就是说它的线性地址空间依然为4G
MySQL:单进程多线程
可以使用2.7G左右,因此使用PAE技术对MySQL没有技术,因此使用MySQL服务时,建议使用64位的
page frame: 分页技术
物理地址中的内存空间,被划分成了多个页面空间,都被组织成为多个页面形势
从页面到页框完成映射的
一个进程读取数据时,首先需要把数据载入到内存中。遇到经常被调用的数据时,可以配置缓存
如果缓存不断的命中,则说明性能可以不断的提高,将频繁被访问数据放到CPU缓存中
对于CPU来说,CPU的缓存对提高CPU的性能是至关重要的
缓存空间通常是按倍相差的
TLB 转换后元缓存器
page frame:
huge page: 使用大页,来提升TLB的命中率
0000
0001
0101
1111
cpu 1,3
两中拆中方法,拿时间换空间,拿空间换时间
较专业的服务器上会有NUMA的结构,非一致内存访问,NUMA结构的前题是,要有多颗CPU
将进程和CPU完成亲和性绑定,进程命中CPU缓存的命中率,将会变的很高
CPU调优操作
# 查看当前进和运行在哪颗CPU
# ps axo psr,comm,pid
# cat /proc/cpuinfo
# 定义进程号为 11215的进程绑定在第四颗CPU上
# taskset -p -c 3 11215 (为个命令的格式比较诡异)
# taskset -p cpu1,cpu2,... pid
# vim /boot/grup/grub.conf kernel 行加上 isol = 2,3
# cat /proc/interrupts # 通常应该把0号隔离出来,离给内核使用
# ls /proc/irq/0/
# cat /proc/irq/0/smp_affinity
ffffffff,ffffffff 表示任意CPU
# echo 1 > /proc/irq/32/smp_affinity
# cat /proc/irq/32/smp_affinity
# cat
# 对于生产来说,越简单,越标准会好
# 压榨系统资源,会造成系统不稳定的,不到万不得已,不建议这样做的
# nice, renice 经常用到的进程优先级的调整
定义中断 smp affinityy:
# echo cpunumber ,.. > /proc/irq/#/smp_affinity
# 这里使用的cpu应该为isoicpus中定义CPU集合之外的其它CPU
# numa,numactl,numad 尽可能把进程绑定在单颗CPU上
# 对同一个进程来讲,可能适用的调度器有多个,有其优先级较高的调度来器来调度
# SCHED_FIFO [1-99]
chrt -f [1-99] /path/to/program arguments
# SCHED_RR
chrt -f [1-99] /path/to/program arguments
# SCHED_NORMAL (100-139)
进程的调度类别:
SCHEd_FIFO, SCHED_RR:real-time
SCHED_NORMAL, SCHED_OTHER: 100-139
nice,renice (对于已启动的进程使用renice启动)
建议使用CPU Utilization工具:
htop,dstat,glances,sar
w,uptime, vmstat 1 5
# sar -P all 1
# iostat -c 1 2
# sysdig
/proc,/sys
DMA: 直接内存访问
CPU跟外部IO设备交互的方式:
poll:轮询,忙等待
中断:
CPU: 调优
cpu affinity
优先级调整
cgroups,
内存:
overcommit_memory
msg
shm
补充nginx 优化加速
给Nginx上 ngx_http_gzip_module 这个模块;
用 nginx -V 命令查看 configure arguments 是否有
没有的话需要编译加载这个模块
# vim /usr/local/nginx/nginx.conf
# 在 httpd 段中加入以下内容
gzip on;
#该指令用于开启或关闭gzip模块(on/off)
gzip_buffers 16 8k;
#设置系统获取几个单位的缓存用于存储gzip的压缩结果数据流。16 8k代表以8k为单位,安装原始数据大小以8k为单位的16倍申请内存
gzip_comp_level 6;
#gzip压缩比,数值范围是1-9,1压缩比最小但处理速度最快,9压缩比最大但处理速度最慢
gzip_http_version 1.1;
#识别http的协议版本
gzip_min_length 256;
#设置允许压缩的页面最小字节数,页面字节数从header头得content-length中进行获取。默认值是0,不管页面多大都压缩。这里我设置了为256
gzip_proxied any;
#这里设置无论header头是怎么样,都是无条件启用压缩
gzip_vary on;
#在http header中添加Vary: Accept-Encoding ,给代理服务器用的
gzip_types
text/xml application/xml application/atom+xml application/rss+xml application/xhtml+xml image/svg+xml
text/javascript application/javascript application/x-javascript
text/x-json application/json application/x-web-app-manifest+json
text/css text/plain text/x-component
font/opentype font/ttf application/x-font-ttf application/vnd.ms-fontobject
image/x-icon;
#进行压缩的文件类型,这里特别添加了对字体的文件类型
gzip_disable "MSIE [1-6]\.(?!.*SV1)";
#禁用IE 6 gzip
# vim /etc/nginx/conf.d/ssjinyao.conf
# 在虚拟主机server 段中加入以下内容
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|flv|ico)$ {
expires 30d;
access_log off;
}
location ~ .*\.(eot|ttf|otf|woff|svg)$ {
expires 30d;
access_log off;
}
location ~ .*\.(js|css)?$ {
expires 7d;
access_log off;
}