• 系统优化


    系统优化
    linux系统优化,调优
    (微调)
    加硬件
    架构
    云  资源流动性 
    redhat官方文档
    业务上线之前的优化:
    1,安装系统优化
    以教学环境500G硬盘为例
    /boot 100M-200M (只存放grub和启动有关文件,不存放其它)
    / 80G-100G(因为很多人默认会把各种东西放到根目录下,没有单独挂载的分区都属于根);
    swap 内存小就一般分2倍,内存大(现在的服务器16G以上内存很常见)就最大4G或8G
    /var 50-100G (主要存放日志,邮件,ftp,httpd等家目录,kvm的磁盘文件等)
    /vm 50-100G (主要存放vmware虚拟机)
    /data 50G-100G左右 (主要存放你的个人数据)
    因为教学需要,还需要留一点空间用于以后分区用。
    如果你的系统出了严重问题,能排错就排错,不能或很麻烦在重装时只格式化根分区就可以了,重装完后,改写/etc/fstab
    根分区分得太小,满了怎么办?如果是lvm可以在线扩容,没用lvm只能去把根分区下的一些数据移到其它分区 (除非用新一代文件系统如btrfs这种)
    b,软件包的选择:你需要啥就安装啥(如果你非常在意系统瘦身,那么选择最小化安装,再安装应用时少啥就装啥)
    c,bios(UEFI)和grub加密码增强安全性
    swap有两种做法(swap文件和swap分区,swap分区会更有效,建议使用swap分区)
    swap文件做法如下
    # dd if=/dev/zero of=/test/swapfile bs=1M count=1000
    # mkswap /test/swapfile
    # swapon /test/swapfile
    # swapoff /test/swapfile --不用了就swapoff(swapon的反向操作)
    swap加分区做法:
    先使用fdisk或parted分一个区,如/dev/sdaX
    # mkswap /dev/sdaX
    # swapon /dev/sdaX
    最后写到fstab里
    2,
    a,关闭不用的服务 (service xxx stop 或 chkconfig xxx off或 ntsysv --level 2345)
    有几个服务记录不要关闭了:haldaemon,messagebus这两个服务关闭任意一个,就造成开机鼠标键盘无法用
    常见的不关闭服务:network,sshd,rsyslog,vmware,libvirtd等
    b,没有服务脚本的可以写服务脚本,或者有些服务脚本写得不好,你可以修改代码
    c,服务脚本权限降权(chmod 700 -R /etc/init.d/*),或者结合sudo进行相应授权
    d,没有服务脚本的进程,可以使用kill来关闭(注意kill -9和kill -15的区别)
    3,静态IP,网关,dns指向
    # /etc/init.d/NetworkManager stop
    # chkconfig NetworkManager off
    然后配置静态ip
    # vim /etc/sysconfig/network-scripts/ifcfg-xxx
    DEVICE=xxx
    ONBOOT=yes
    NM_CONTROLLED=no
    BOOTPROTO=static
    IPADDR=x.x.x.x
    NETMASK=x.x.x.x
    GATEWAY=x.x.x.x
    DNS1=x.x.x.x
    DNS2=x.x.x.x
    4,主机名配置和绑定
    问题:域名和主机名有什么区别?
    域名:公网名字,花钱买,唯一
    主机名:内网名字
    如果公司现在有100甚至更多台机器,都要互相绑定主机名
    方法一:shell脚本,先在其中一台绑定所有机器的IP与名字到/etc/hosts文件,再用shell脚本循环拷到其它所有机器(ssh等效性或expect)
    方法二:在安装所有机器时,使用kickstart或cobbler,让其在安装的时候就通过postscripts实现安装完后就统一截IP,配置主机名,绑定主机名);此方法不适合主机名有改变的情况 
    方法三:内网DNS(/etc/nsswitch.conf这个文件里面配置了,称查找/etc/hosts,再查找DNS)
    方法四:使用自动化运维工具,如puppet
    根域
    w网
     |
    |
    自搭dns服务器
    5,yum配置
    首先要注意yum只能安装rpm包,不能安装源码包。如果觉得安装源码包麻烦,甚至可以自己把源码做成rpm包(要求水平较高)
    一般不可能所有服务器都用公网的yum源。建议把本地iso和第三方下载的rpm包都在其中一台服务器做成yum仓库,其他服务器就直接使用这台的yum源就可以了
    yum的路径怎么写?
    答案:要写repodata的上一级目录的路径
    如何下载
    a),先配置远程公网yum源路径
    如下
    [puppet]
    name=puppet
    baseurl=http://yum.puppetlabs.com/el/6.5/products/x86_64/
    enabled=1
    gpgcheck=0
    b)使用reposync命令
    reposync --repoid=puppet
    都会下载到本地当前目录
    c)因为下载后,没有repodata目录,所以需要手动生成
    yum install createrepo -y
    createrepo 下载的目录路径/
    d)通过服务如httpd做成其它服务器能使用的yum源
    --------------------------------------------------------------------
    扩展使用yum要注意的一个小例子
    使用yum remove 删除软件包时,一般会删除一些依赖包,然后 yum install重新安装,不一定会把这些依赖包自动装回来。所以建议都把这些依赖包手动再安装回来
    # rpm -qa |grep ^mysql --我这里查找到已经安装了这么多mysql的软件包
    mysql-devel-5.1.71-1.el6.x86_64
    mysql-test-5.1.71-1.el6.x86_64
    mysql-server-5.1.71-1.el6.x86_64
    mysql-connector-java-5.1.17-6.el6.noarch
    mysql-5.1.71-1.el6.x86_64
    mysql-libs-5.1.71-1.el6.x86_64
    mysql-bench-5.1.71-1.el6.x86_64
    mysql-connector-odbc-5.1.5r1144-7.el6.x86_64
    下面我需要重装这些软件包,在使用yum remove mysql*时删除的包包括依赖性特别的多,这样很可能会因为删除了其它服务需要使用的rpm包,而造成其它服务或系统其它的功能缺失
    解决方法:
    方法一:
    rpm -e mysql-5.1.71-1.el6.x86_64 --nodeps
    rpm -e mysql-devel-5.1.71-1.el6.x86_64 --nodeps
    rpm -e mysql-server-5.1.71-1.el6.x86_64 --nodeps
    rpm -e mysql-test-5.1.71-1.el6.x86_64 --nodeps
    rpm -e mysql-connector-java-5.1.17-6.el6.noarch --nodeps
    rpm -e mysql-libs-5.1.71-1.el6.x86_64 --nodeps
    rpm -e mysql-bench-5.1.71-1.el6.x86_64 --nodeps
    rpm -e mysql-connector-odbc-5.1.5r1144-7.el6.x86_64 --nodeps
    再重装回来
    yum install mysql*
    方法二:
    rpm -qa |grep ^mysql |xargs rpm -e --nodeps
    再重装回来
    yum install mysql*
    方法三:
    直接使用yum remove mysql* 去删除包
    再用下面的命令重装回来
    # cat /var/log/yum.log |grep "Jun 04" |grep Erased |awk '{print $NF}' |xargs yum install -y
    --上面三个方法最好的应该是方法二,操作快速,而且不会像方法三那样去删除了其它的依赖性包(因为你删除其它的依赖性包,就算是再安装回来,那么原来的配置文件被刷新了)
    6,用户有关的:
    a,删除不需要使用的用户(如adm,lp,sync,shutdown等)加强安全(可选)
    b,写脚本定期检查无密码账号或uid为0的账号 awk -F: '$3==0 {print $1}' /etc/passwd
    c,创建要用的普通用户(如果一个用户只用于跑服务daemon,可以指定家目录为/dev/null,uid小于500,登录环境为/sbin/nologin等,如useradd -r -d /dev/null -s /sbin/nologin xxx) 看需求修改/etc/login.defs文件。或者在登录或登出时有些特殊需要,可以修改/etc/skel/.bash_profile和/etc/skel/.bash_logout
    d,做完后,保证口令文件的安全(如,不需要修改就chattr +i /etc/passwd,chattr +i /etc/shadow,chattr +i /etc/group,chattr +i /etc/gshadow)
    e,对相应的普通用户做sudo授权
    f,限制普通用户的console权限 
    rm -rf /etc/security/console.apps/*
    g,设置用户自动退出登录时间限制
       如:在/etc/profile里加入 TMOUT=300 表示5分钟不操作,会自动退出
    7,按需求定制pam,iptables(firewalld)或selinux的配置
    8,内核优化:内核编译优化和内核参数优化(这里讨论内核编译优化)
    如果有必要,并且技术水平成熟的情况下,可以重新编译升级内核
    问题:OS自带的内核非常稳定,什么情况下需要自己编译内核?
    答案:内核如果不支持你所需要的一个功能,可以重编内核来加上这个功能。但是一般来说,没有内核不支持的功能,但redhat自带的内核不一定给你加上了这个功能。
    比如,要在linux下支持ntfs格式挂载,方法有:
    一,重编内核,加上ntfs挂载功能(因为redhat默认没有加到内核里,但内核是支持的)
    二,用第三方软件,把功能做成模块加到内核上,让其支持
    还有一个情况需要自己编译内核,就是内核编译优化,简单来说就是把内核里自己用不到的功能都去掉,只留下自己用得到的功能。
    注意:生产环境不建议你真的去编译内核,因为你很难编译出一个稳定且正符合你所用的内核。
    重编译内核或新内核的步骤:
    a)下载新内核源码,解压;OS自带内核源码在(/usr/src/kernels/`uname -r`/,如果此内核源码目录不存在,可以通过yum install kernel-devel -y安装)
    b)cd 内核源码目录/
    c)make menuconfig
    按你需求来选择功能
    * 代表编进内核
    M 代表编译成模块 需要modprobe xxx装载才能使用
    空 代表不需要这个功能
    d) 选择好功能后,保存,会把你所有的选择保存到一个.config文件里
    e) make
    f) make modules_install --把编译后的模块复制到/lib/modules/内核新版本/ 以后就可以用modprobe insmod来装载使用
    g) make install
    h) reboot 重启你的系统,在grub菜单选择新的内核登录你的OS
    9,文件系统
    ext2,ext3,ext4,fat32,ntfs,xfs,reiserfs,zfs,btrfs,jfs,nfs,gfs2,ocfs......
    下面以rhel6默认ext4为例简单讨论ext4的优化
    a,单个文件可以chattr +A xxx 让这个文件的atime不变化(因为atime是文件的访问时间,基本没什么实用价值,所以让其不变化,就是一种优化)
    b,只优化单个文件肯定不行,所以需要优化整个文件系统让所有文件atime都不变化
    在rhel5里cat一次,atime就会变一次
    在rhel6里只有当atime时间早于或等于mtime或ctime之一时,cat这个文件,atime才会变(因为rhel6已经做了相对的优化,主要实现的方法是在mount时加了relatime)
    但我们想优化更彻底,那么让atime在任何情况下都不会变,做法为:
    # mount -o defaults,noatime /dev/sda7 /test/ --这样做后,/dev/sda7这个分区里的所有文件都不变改变atime了
    mount -o defaults,norelatime,strictatime /dev/sda7 /test/ --这样做是做成和rhel5一致,每cat一次文件,文件的atime都会变
    所有分区都要这样做,就在/etc/fstab里把所有分区的defaults参数后加,noatime就可以了
    但写到fstab里需要重启才能生效,因为根分区不能umount再mount,所以要使用下面remount的参数在线重挂载
    # mount -o remount,defaults,noatime /
    c,Ext4 提供三种数据日志记录方式: data=writeback 、 data=ordered (默认) data=journal。
    data=writeback 速度最快,但不记录文件系统日志,只记录基本元数据,数据安全性低
    data=journal 速度最慢。但记录完整文件系统日志,数据安全性高
    data=ordered 居中
    如果要修改,在mount时用-o data=writeback来挂载就可以.或者在/etc/fstab里defaults,data=writeback就可以了
    小实验:
    用一个实验分区,分三种日志记录方式去挂载,然后使用dd命令写文件来测试比较速度
    mount -o defaults,data=writeback /dev/sda7 /test/
    cd /test
    dd if=/dev/zero of=test
    --最快
    mount -o defaults,data=journal /dev/sda7 /test
    cd /test
    dd if=/dev/zero of=test
    --最慢
    mount -o defaults,data=ordered /dev/sda7 /test
    cd /test
    dd if=/dev/zero of=test
    --居中
    综合上面所述,你可以在/etc/fstab文件里把defaults改为defaults,noatime,data=writeback来提高文件系统速度
    小实验:
    使用下面命令模拟一个分区丢失superblock,相当于是文件系统出问题
    # dd if=/dev/zero of=/dev/sda9 bs=1 count=1024 seek=1024
    文件系统出问题,挂载就会报下面的错误
    # mount /dev/sda9 /mnt/
    mount: you must specify the filesystem type
    排错,不能直接重新格式化,那样的话数据全丢了.所以可以用下面的命令修复
    # fsck /dev/sda9
    另一个课后小实验
    把你系统时间改到将来,然后把开机要挂载的分区重新挂载一下(比如boot分区或根分区这种),然后reboot重启系统
    会在启动系统时启不来,会报一个"分区挂载时间在将来的错误",解决方法也是fsck接要修复的分区
    10,内核参数优化 (不是内核编译,是内核参数修改)
  • 相关阅读:
    全景3d
    node.JS
    同步、异步
    必填
    this.$http.post ||this.$http.put||vue 获取url参
    硬编码转换单位||vue
    路由下二级跳转: childen 的childen
    vue侧边栏导航和右边内容一样高
    v-for v-if || v-else
    Python_Automation_04Email_smtplib
  • 原文地址:https://www.cnblogs.com/skyzy/p/9201433.html
Copyright © 2020-2023  润新知