WenJunjie Blog

sysadmin

Some Idea

| Comments

  • 智能家居
  • 机房评估
  • 数据中心机房分布

  • 管理脚本

  • 增加空间脚本
  • 增加svn smb 账号

IDC规划 虚拟服务器选配

学习rpm包更新

nginx php优化

架构设计

对不同层的各种开源解决方案要有较详细了解 了解其应用场景

  • 了解无状态和分布式的细节
  • mailing list
  • shell学习 workon wk

  • TCP TIME_WAIT sockets state time_wait connections CLOSE_WAIT

Too many open files

quick test vps vm

系统常见问题

linux系统常见故障及处理方法

处理思路 –分析查找问题的原因 1. 重视报错提示信息:基本定位问题 2. 查阅日志文件:系统日志文件/var/log/和应用日志文件,另远程管理系统(Dell iDRAC)日志,定位问题所在 3. 分析、定位问题:根据报错信息,结合日志文件,考虑相关情况,最终找出引起问题的原因 4. 解决问题:根据问题的原因,解决问题

  • 忘记linux root密码 -> 开机 single
  • linux系统无法启动 硬件原因和操作系统原因 文件系统配置不当 /etc/inittab /etc/fstab 用系统安装盘,进入linux rescue修复模式 非法关机,导致root文件系统破坏,无法正常引导启动 fsck -y 硬件故障

    linux引导程序出问题,进入linux rescue,然后修改对应的引导程序或者重新安装引导程序 linux内核崩溃或丢失,同样进入linux rescue模式,加载root分区,重新编译内核 文件系统破坏严重,内核也崩溃,可直接重新安装系统,注意将系统数据备份转移再重新安装

  • 浅谈linux系统下常见的故障与处理方法

/var/log/messages 发现:

[ 1.548882] ACPI Error: Field [CPB3] at 96 exceeds Buffer [NULL] size 64 (bits) (20090903/dsopcode-596) 383 Dec 4 16:12:49 pangu kernel: [ 1.548889] ACPI Error (psparse-0537): Method parse/execution failed [_SB.OSC] (Node ffff88045e4468c0), AE_AML_BUFFER_LIMIT irbr0: starting userspace STP failed, starting kernel STP 在启动参数中加上:acpi=ht,这个选项是设置为禁止acpi的其他功能,只保留多核功能.有的教程是让加上acpi=off,那个禁用了之后,在很多机器上会导致,多核的机器只认一个.

1.修改启动时的acpi参数要慎重,有时会导致电源管理失效….做好去机房的准备.

2.现在grub把配置文件从/boot/menu.lst改到了/boot/grub/grub.cfg中.

  • Read-only file system
  • ip_conntrack: table full, dropping packet.
  • 磁盘空间已经满了

  • 硬盘读取速度慢

  • 文件已经删除,磁盘空间未释放 dh -h显示分区已经满 du -sh /分区* 显示所有才只使用部分空间 可能是rm删除正在写的文件,已经文件删除了,但磁盘空间未释放 lsof |grep deleted 查出进程 删除正在写的文件 cat /dev/null > file

swapout swapin

  • find目录有大量文件,消耗资源严重

    find /tmp -name “picture_*” -mtime +1 -exec rm -f {};

    cd /tmp time=date -d "2 day ago" "+%b %d" ls -l |grep “picture” |grep “$time”|awk ‘{print $NF}’|xargs rm -rf

  • too many open file

echo “” >> /etc/security/limits.conf echo “ soft nproc 65535″ >> /etc/security/limits.conf echo “ hard nproc 65535″ >> /etc/security/limits.conf echo “ soft nofile 65535″ >> /etc/security/limits.conf echo “ hard nofile 65535″ >> /etc/security/limits.conf echo “” >> /root/.bash_profile echo “ulimit -n 65535″ >> /root/.bash_profile echo “ulimit -u 65535″ >> /root/.bash_profile

ulimit -u 655345 && ulimit -n 65535

yum常见问题

You could try using –skip-broken to work around the problem You could try running: package-cleanup –problems package-cleanup –dupes rpm -Va –nofiles –nodigest The program package-cleanup is found in the yum-utils package.

yum clean all rpm –rebuilddb yum update

yum remove phpRunning Transaction yum -y erase php php-mbstring php-mysql php-common yum -y install php53 php53-mbstring php53-mysql

yum install yum-utils package-cleanup –problems package-cleanup –dupes rpm -Va –nofiles –nodigest

Resolving Dependencies There are unfinished transactions remaining. You might consider running yum-complete-transaction first to finish them. The program yum-complete-transaction is found in the yum-utils package.

yum install yum-utils yum-complete-transaction –cleanup-only

glibc-headers-2.5-81.el5_8.7.x86_64 from updates has depsolving problems –> Missing Dependency: kernel-headers >= 2.2.1 is needed by package glibc-headers-2.5-81.el5_8.7.x86_64 (updates) glibc-headers-2.5-81.el5_8.7.x86_64 from updates has depsolving problems –> Missing Dependency: kernel-headers is needed by package glibc-headers-2.5-81.el5_8.7.x86_64 (updates) Error: Missing Dependency: kernel-headers >= 2.2.1 is needed by package glibc-headers-2.5-81.el5_8.7.x86_64 (updates) Error: Missing Dependency: kernel-headers is needed by package glibc-headers-2.5-81.el5_8.7.x86_64 (updates)

vi /etc/yum.conf #exclude=kernel* yum install kernel-headers

“cannot execute binary file”

out of memory oom-killer

  1. Linux下面有个特性叫OOM killer(Out Of Memory killer),会在系统内存耗尽的情况下跳出来,选择性的干掉一些进程以求释放一些内存。典型的情况是:

    如果kill应用程序,使得应用不再服务。 如果kill sshd,使得ssh无法登录,却能ping通。(很常见,经常出现这种情况)。 如果kill 某些系统进程,使得系统瘫痪。

重启机器后查看系统日志会发现Out of Memory: Killed process 或Out of Memory: Killed process

现象 Aug 26 07:34:38 DO-NY-H2 kernel: Out of memory: Kill process 4587 (mysqld) score 328 or sacrifice child Aug 26 07:34:38 DO-NY-H2 kernel: Killed process 4587, UID 27, (mysqld) total-vm:1074496kB, anon-rss:332520kB, file-rss:2196kB

  1. 关闭/开启OOM killer cat /proc/sys/vm/oom-kill echo “0” > /proc/sys/vm/oom-kill echo “1” > /proc/sys/vm/oom-kill vim /etc/sysctl.conf vm.oom-kill = 0 此时,当进程被oom-killer尝试杀死而没有成功时,会把相关信息记录到/var/log/messages文件中,信息如下: “Would have oom-killed but /proc/sys/vm/oom-kill is disabled”

  2. Linux的Overcommit策略配置 cat /proc/sys/vm/overcommit_memory

    0:启发式策略,比较严重的Overcommit将不能得逞,比如你突然申请了128TB的内存。而轻微的Overcommit将被允许。另外,root能Overcommit的值比普通用户要稍微多些。 1:永远允许Overcommit,这种策略适合那些不能承受内存分配失败的应用,比如某些科学计算应用。 2:永远禁止Overcommit,在这个情况下,系统所能分配的内存不会超过swap+RAM*系数(/proc/sys/vm/overcmmit_ratio,默认50%,你可以调整),如果这么多资源已经用光,那么后面任何尝试申请内存的行为都会返回错误,这通常意味着此时没法运行任何新程序。

只要存在Overcommit,就可能会有OOM killer跳出来。那么OOM killer跳出来之后选目标的策略又是什么呢?期望的是:没用的且耗内存多的程序被kill。

vm.overcommit_memory=1

vm.overcommit_memory = 2

vm.overcommit_ratio = 80

  1. 进程的OOM策略 Linux下每个进程都有个OOM权重,在/proc//oom_adj里面,取值是-17到+15,取值越高,越容易被干掉。 最终OOM killer是通过/proc//oom_score这个值来决定哪个进程被干掉的。这个值是系统综合进程的内存消耗量、CPU时间(utime + stime)、存活时间(uptime - start time)和oom_adj计算出的,消耗内存越多分越高,存活时间越长分越低。总之,总的策略是:损失最少的工作,释放最大的内存同时不伤及无辜的用了很大内存的进程,并且杀掉的进程数尽量少。 另外,Linux在计算进程的内存消耗的时候,会将子进程所耗内存的一半同时算到父进程中。这样,那些子进程比较多的进程就要小心了。

当Linux内存不足时,会启动OOM机制,杀掉一部分进程以便让系统缓过来,具体杀掉谁取决于进程分数的高低,也就是「/proc//oom_score」,我们可以通过调低分数的大小来降低关键进程被杀的风险:老版本Linux的调节开关是「oom_adj=-17」,新版本Linux的调节开关是「oom_score_adj=-1000」

防止关键进程被系统因内紧张(OOM)被杀死:设置参数/proc/pid/oom_adj为-17,可禁止被OS杀。 OS会给每个进程算一分数来决定杀哪些进程,每个进程的oom分数可以/proc/pid/oos_score中找到。我们运维过程中保护的一般是sshd和一些管理agent。

# swapoff /dev/sda3 dd if=/dev/zero of=/swap bs=1024 count=$[102410244] mkswap /swap swapon /swap

/var/log/messages Aug 26 13:51:24 DO-NY-H2 kernel: Adding 1048568k swap on /swap. Priority:-1 extents:28 across:6676476k

/etc/fstab LABEL=SWAP swap swap defaults 0 0

ubuntu sudo dd if=/dev/zero of=/var/swapfile bs=1M count=2048 && sudo chmod 600 /var/swapfile && sudo mkswap /var/swapfile && echo /var/swapfile none swap defaults 0 0 | sudo tee -a /etc/fstab && sudo swapon -a

OOM

关闭oom killer echo 1 > /proc/sys/vm/panic_on_oom echo 1 > /proc/sys/vm/overcommit_memory echo 0 > /proc/sys/vm/overcommit_ratio

sshd rsyslog agent… echo -17 > /proc/[pid]/oom_adj /proc/[pid]/oom_adj中oom_adj的取值范围是-17~15,当该值为-17时,系统将不会杀死指定pid的进程,而-16~15则会使得进程的/proc/[pid]/oom_adj值呈指数(K*2n)形式递增,即它们被杀掉的可能性呈指数递增。针对init(进程号为1)这个进程,无论该值设为多少都不会被杀。

在触发 OOM 后立刻触发 kernel panic,kernel panic 10秒后自动重启系统。 # sysctl -w vm.panic_on_oom=1 vm.panic_on_oom = 1

# sysctl -w kernel.panic=10 kernel.panic = 10

# echo “vm.panic_on_oom=1” >> /etc/sysctl.conf # echo “kernel.panic=10” >> /etc/sysctl.conf

# ps aux | grep mysqld mysql 2196 1.6 2.1 623800 44876 ? Ssl 09:42 0:00 /usr/sbin/mysqld

# cat /proc/2196/oom_score_adj 0 # echo -15 > /proc/2196/oom_score_adj

理解和配置 Linux 下的 OOM Killer

check mysql swap out free -m 查看进程使用多少交换分区 awk ‘/^Swap:/ { SWAP+=$2 } END { print SWAP” kB” }’ /proc/$(pidof mysqld)/smaps

solaris pmap -S 925 |grep mysqld

系统调优

常见容易到达的瓶颈 保持长连接socket型 短连接是实现应用层负载均衡的基本手段 各服务器之间数据同步是负载均衡必要条件

常见系统瓶颈 open files ephemeral ports time_wait state connection tacking speed bump other things to tune * Linux TCP/IP Tuning for Scalability

应用优化

nginx php-fpm performance

误删除库或包

处理思路: 查出该库是在哪个包中,重新安装该包; 若仍无法解决,查出该库是否被升级过; 把旧库改回来,若无法使用相关命令; 找不依赖该库的命令改回来

/usr/lib64/libstdc++.so.6 rpm -qf /usr/lib64/libstdc++.so.6 libstdc++-4.1.2-52.el5_8.1 libc.so.6异常,无法使用cp mv等命令 for i in find -type f; do ldd $i |grep libc.so.6 >/dev/null 2>&1 || echo $i; done busybox rm libc.so.6 busybox ln -s libc-2.5.so libc.so.6

自动更新发布

puppet cap yum升级 代码升级

监控

应用监控

常见进程作用

kswapd0 系统一定时间唤醒kswapd,看内存是否紧张,不紧张就睡眠;pages_low->pages_high; 虚拟内存管理中负责换页,内存不足,执行换页操作 kjournald ext3文件系统的日志进程 pdflush 将内存中的内容和文件系统进行同步 10% cat /proc/sys/vm/dirty_background_ratio kirqd内核线程纠正IRQ在CPU上的分配,周期性的执行扫描每个CPU处理的中断个数,发现不均衡时重新调整CPU的负载 ksoftirqd

系统库、静态库、动态库

Knowledgebase 知识

ticket问题

Environment 环境 lsb_release -d CentOS release 5.7 (Final) Situation 情形 Resolution 解决 Status Workaround Addtional Information 附加信息 Root cause Background Related Issues Disclaimer 声明

现状描述->错误分析->检查日志->原因解析

问题描述->问题排查->问题原因->问题反思

Case I Solution

项目

虚拟化开发环境vagrant aws aliyun puppet快速部署 持续集成jenkins

DBA

大表操作问题 MYSQL MONITORING SOLUTIONS

linux系统 原理 服务

开发流程规范

运维 服务器状态 运维状态 优化工具

linux系统运维

  1. 分区管理 parted
  2. 日志管理 logrtate rsyslog
  3. 系统报告 系统运行状态 linuxmon
  4. 系统操作记录 history ticket maillist wiki

  5. 常用操作 日志检查 进程检查

  6. 常用命令 lsof -s -p pid
  7. 需要遵循的运维操作文档

    软件包、环境说明、操作规范(用户权限控制 文件删除 误操作 rm操作 操作可回滚性)、定期备份、安全重启init 6

    • 运维操作规范
  8. 日志审计

    自动发邮件 /etc/aliases 文件中条目的例子,可以设置这种类型的别名: trouble: admin,/var/spool/mail/admin.archive

  9. 运行安全

    密码 setuid文件 bios root日志文件和邮箱 定期检查系统日志文件 logwatch /var/log/messages,其中记录了操作系统和一些应用程序的错误;/var/log/secure,其中包含了与系统安全性有关的消息 ; /var/log/maillog,其中包含邮件系统的错误;/var/log/cron,其中包含 crond 的消息 硬盘监控 报告 快速增长的文件 处理方式 压缩文件及目录、删除意外core及无用文件、增大LVM文件系统、归档转移文件 find / -type f -name core|xargs file|grep ‘B core file’|sed ’s/:ELF.*//g’|xargs rm -f 审查 /tmp 和 /var/tmp 目录中的旧临时文件并删除。对 /var/mail、/var/spool 和 /var/log 中的磁盘使用情况保持跟踪 /var/spool/clientmqueue/ 删除目录中未使用的空间 文件名称 大量小文件

mkdir /home/max/new 
mv /home/max/large/* /home/max/large/.[A-z]* /home/max/new 
rmdir /home/max/large 
mv /home/max/new /home/max/large
  1. 服务器应用快速恢复或程序做到无状态

    日常数据自动备份(备份策略)

    系统目录文件
    /etc/fstab
    /boot/grub/grub.conf
    /boot/grub/menu.lst
    /etc/sysconfig/network-scripts/ifcfg-eth*
    /var/log/
    /var/spool/
    /usr/local/src/
    程序目录文件
    /usr/local/nginx-1.0.12/conf/nginx.conf
    /usr/local/nginx-1.0.12/conf/vhost/
    /usr/local/php-5.3.10/etc/
    用户数据目录文件
    

    数据丢失:硬件出错、软件问题、操作因素、自然灾难 备份数据检查 备份历史记录(backup history) http://docs.huihoo.com/gnu_linux/sag_cn/Image8.gifLinux系统管理者手册

    环境快速部署脚本(准确时间) 数据库备份 备份脚本:按库按表按日期备份打包,可过滤表,备份时间差,超过一定时间报警,备份过程中取硬盘读写状态

Comments