Linux进程状态

S(TASK_INTERRUPTIBLE),可中断的睡眠状态。处于这个状态的进程因为等待事件的发生(比如等待socket连接、等待信号量),而被挂起。这些进程的task_struct结构被放入对应事件的等待队列中。当这些事件发生时(由外部中断触发、或由其他进程触发),对应的等待队列中的一个或多个进程将被唤醒。
D(TASK_UNINTERRUTIBLE),不可中断的睡眠状态。不可中断,指的并不是CPU不响应外部硬件的中断,而是指进程不响应异步信号。
在进程对某些硬件进行操作时(比如进程调用read对某个设备文件进行读操作,而read系统调用最终执行到对应设备驱动的代码,并与对应的物理设备进行交互),可能需要使用TASK_UNINTERRUPTIBLE状态对进程进行保护,以避免进程与设备间的过程被打断,造成设备陷入不可控的状态。
Linux系统中也存在容易捕捉的TASK_UNINTERRUPTIBLE状态。执行vfork系统调用后,父进程将进入TASK_UNINTERRUPTIBLE状态,直到子进程调用exit或exec。
D状态,往往由于I/O资源得不到满足而引发等待。
du – estimate file space usage
du命令会对统计文件逐个调用fstat这个系统调用
df -report file system disk space usage
df命令使用statfs这个系统调用

关于du与df统计目录占用空间大小不同的解析

du -estimate file space usage
du命令会对统计文件逐个调用fstat这个指令(系统调用),获取文件大小。它的数据基于文件获取,可以跨多个分区操作。
df -report file system disk space usage
df命令使用statfs这个指令(系统调用),直接读取分区的超级块信息获取分区使用情况。它的数据基于分区元数据,只能针对整个分区。
导致这两个命令查看磁盘容量不一致的原因:用户删除了大量的文件后,在文件系统目录中已经不可见,所以du就不会再统计它,然而如果此时还有运行的进程持有这个已被删除的文件句柄,那这个文件并不会真正在磁盘中被删除,分区超级块中的信息也就不会更改,df仍会统计这个被删除的文件。
可通过lsof命令查下处于deleted状态的文件:
lsof | grep deleted

Abusing Linux’s firewall: the hack that allowed us to build Spectrum(译文)

Abusing Linux’s firewall: the hack that allowed us to build Spectrum

深度使用Linux防火墙:允许我们构建Spectrum的黑客行为

Today we are introducing Spectrum: a new Cloudflare feature that brings DDoS protection, load balancing, and content acceleration to any TCP-based protocol.

今天我们来介绍spectrum:一项Cloudflare新业务,可为任何基于TCP协议的服务提供DDoS防护、负载均衡和内容加速功能。

Continue reading »

多可用区部署

应用场景说明:

1、多可用区部署,避免单可用区故障;

2、考虑到阿里云ELB负载均衡(产品)按QPS转发性能收费,多ELB负载均衡实例部署能节省成本,平摊到单台实例承载请求量免费版即可满足需求。

架构说明:

采用智能DNS(DNSpod企业版按区域解析)同时开启D监控(设置A记录对应IP 1分钟内不可达暂停解析,ok时自动开启)。

双活负载均衡架构

组件:HAproxy+Keepalived

说明:

1、双VIP机制,正常情况下VIP1<—>HA1,VIP2<—>HA2,如其中一台HA服务器宕机,则两个VIP都将绑定在另外那台正常的HA服务器;

2、HA1和HA2同时部署应用程序,最少单机双实例,以防后端服务器全部宕机时,HA服务器可应急。

keepalived安装详解

kernel version:2.6.32-696.16.1.el6.x86_64
keepalived version:1.4.2

备注:之前我多次尝试编译安装1.3.6~1.3.9,make报错,在GitHub提交issues后,项目维护者: pqarmitage回复, 为了让keepalived构建,必须使用–disable-libipset配置选项。他不确定这是否是由于RedHat将Linux 2.6.39的ipset功能反向移植到2.6.32,或者是否需要修复keepalived,同时他提交6cdd015(git版本tag)尝试解决这个问题,得到反馈后再试问题还没得到彻底解决,最终他再次提交e941d1b,已完全修复了使用ipset构建的问题,因此不再需要–disable-libipset选项。 链接:https://github.com/acassen/keepalived/issues/703#issuecomment-346334627 Continue reading »

节假日值班安排-模板

亲爱的各位同事: 大家好!假期即将来临之际,为保证公司线上业务在春节期间持续稳定的运行,XX部有设立电话值班机制,如下为具体安排:

日期(农历)值班人员电话
邮箱
请假情况
02-15(年三十)
02-16(年初一)
02-17(年初二)
02-18(年初三)
  其中值班小组服务监督负责人:XXX 本人在此提前祝各位伙伴春节愉快,阖家欢乐!同时感谢大家一直以来对运维部的信赖与支持!

CentOS7系统服务脚本编写

    最近开始把玩CentOS 7,发现之前的部分服务启动脚本在新版OS中运行异常(报错),特意摸索了下,个人感觉7的服务自启动脚本编写非常简单方便。
# vim /usr/lib/systemd/system/nginx.service
[Unit]
Description=nginx – high performance web server
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf
ExecReload=/usr/sbin/nginx -s reload
ExecStop=/usr/sbin/nginx -s stop
[Install]
WantedBy=multi-user.target
# systemctl status nginx.service 查看服务当前状态
# systemctl enable nginx.service 设置开机自启动
# systemctl list-units –type=service 查看所有已启动的服务

Continue reading »

Linux服务器后期添加单独swap配置说明

1、创建用于交换分区的文件:
# dd if=/dev/zero of=/mnt/swap bs=block_size count=number_of_block
注:block_size、number_of_block大小可自定义,比如bs=1M count=1024代表设置1G大小swap分区。
2、设置交换分区文件:
# mkswap /mnt/swap
3、立即启用交换分区文件
# swapon /mnt/swap
注:如果在 /etc/rc.local 中有 swapoff -a 需要修改为 swapon -a
4、设置开机时自启用 SWAP 分区:
需要修改文件 /etc/fstab 中的 SWAP 行,添加
# vim /etc/fstab
修改或添加如下行:
/mnt/swap swap swap defaults 0 0
注:/mnt/swap 路径可以修改,可以根据创建的 SWAP 文件具体路径来配置。
5、修改 swpapiness 参数
在 Linux 系统中,可以通过查看 /proc/sys/vm/swappiness 内容的值来确定系统对 SWAP 分区的使用原则。当 swappiness 内容的值为 0 时,表示最大限度地使用物理内存,物理内存使用完毕后,才会使用 SWAP 分区。当 swappiness 内容的值为 100 时,表示积极地使用 SWAP 分区,并且把内存中的数据及时地置换到 SWAP 分区。
查看修改前为 0,需要在物理内存使用完毕后才会使用 SWAP 分区:
# cat /proc/sys/vm/swappiness
可以使用下述方法临时修改此参数,假设我们配置为空闲内存少于 10% 时才使用 SWAP 分区:
# echo 10 >/proc/sys/vm/swappiness
若需要永久修改此配置,在系统重启之后也生效的话,可以修改 /etc/sysctl.conf 文件,并增加以下内容:
# vim /etc/sysctl.conf
vm.swappiness=10
# sysctl -p

通过Redis Warning日志展开的学习探索

1、Redis aof持久化遇到Can’t open the append-only file: Permission denied:
这是因为Redis aof持久化生成的文件appendonly.aof默认为只读,首先基于安全考虑,个人建议redis数据目录赋权属组为redis(尽量避免使用root),644权限。
2、WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add ‘vm.overcommit_memory = 1’ to /etc/sysctl.conf and then reboot or run the command ‘sysctl vm.overcommit_memory=1’ for this to take effect.
解决方法:
# echo 1 >  /proc/sys/vm/overcommit_memory  无需重启临时生效
# echo “vm.overcommit_memory=1” >> /etc/sysctl.conf  && sysctl -p永久生效需重启服务器,一般与临时方法一起执行。
overcommit_memory参数说明:
设置内存分配策略(可选,根据服务器的实际情况进行设置)
/proc/sys/vm/overcommit_memory
可选值:0、1、2。
0, 表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。
1, 表示内核允许分配所有的物理内存,而不管当前的内存状态如何;
2, 表示内核允许分配超过所有物理内存和交换空间总和的内存。

Continue reading »