系统优化  系统优化有其两面性,选择优化一个选项的时候,总会牺牲另一个选项的性能 优化的几个方向:
加硬件
架构
云(资源流动性)linux系统优化,调优
(微调)redhat官方文档
Red_Hat_Enterprise_Linux-7-Performance_Tuning_Guide-zh-CN.pdf业务上线之前的优化:
1,安装系统优化
以自用环境500G硬盘为例:
/boot   300M-500M  (只存放grub和启动有关文件,不存放其它)
/       100G-150G(因为很多人默认会把各种东西放到根目录下,没有单独挂载的分区都属于根);
swap    内存小就一般分2倍,内存大(现在的服务器16G以上内存很常见)就最大4G或8G
/var    50-100G (主要存放日志,邮件,ftp,httpd等家目录,kvm的磁盘文件等)
/vm 50-100G (主要存放vmware虚拟机)
/data   50G-100G左右 (主要存放你的个人数据)
还需要留一点空间用于以后分区用。
如果你的系统出了严重问题,能排错就排错,不能或很麻烦在重装时只格式化根分区就可以了,重装完后,改写/etc/fstab
根分区分得太小,满了怎么办?如果是lvm可以在线扩容,没用lvm只能去把根分区下的一些数据移到其它分区 (除非用新一代文件系统如btrfs这种;xfs文件可以使用xfs_growfs来扩容)
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;systemctl stop xxx 或 chkconfig xxx off;systemctl disable xxxx或 ntsysv --level 2345)
有几个服务记录不要关闭了:haldaemon,messagebus这两个服务关闭任意一个,就造成开机鼠标键盘无法用(rhel6下的经验,rhel7未测试,rhel7没有haldaemon服务了)
常见的不关闭服务:network,sshd,rsyslog,libvirtd,ntpd等
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.xrhel7里的nmcli命令非常强大,可以几乎控制网络相关的一切修改4,主机名配置和绑定
问题:域名和主机名有什么区别?
域名:公网名字,花钱买,唯一
主机名:内网名字如果公司现在有100甚至更多台机器,都要互相绑定主机名
方法一:shell脚本,先在其中一台绑定所有机器的IP与名字到/etc/hosts文件,再用shell脚本循环拷到其它所有机器(ssh等效性或expect)
方法二:在安装所有机器时,使用kickstart或cobbler,让其在安装的时候就通过postscripts实现安装完后就统一截IP,配置主机名,绑定主机名);此方法不适合主机名有改变的情况 
方法三:内网DNS(/etc/nsswitch.conf这个文件里面配置了,称查找/etc/hosts,再查找DNS)
方法四:使用自动化运维工具,如puppet,ansible,saltslack......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=0b)使用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,设置用户自动退出登录时间限制如:在/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菜单选择新的内核登录你的OS9,文件系统
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接要修复的分区=============================================================================================================优化
横向:加新的设备,架构扩展
纵向:替换新的更好的设备,使设备负载能力更高下面我们讨论的是不加设备也不换设备的基础上进行系统微调前面讨论的是系统安装到业务上线之前的一些基本优化,如果业务已经在线上,你要优化,第一步如何做?比如一个web服务器慢,可以会有哪些问题?
思路:cpu->mem->io->file system->network->os参数->服务本身配置-》开发代码首先要进行服务器数据采集,和性能监测分析
方法有
一:使用cacti,nagios,zabbix等监控工具
二:使用linux自带的一些监控指令:如vmstat,iostat,mpstat,sar等等硬件问题CPU子系统    内存子系统 IO子系统      网络子系统  文件系统运行的服务等一,
cpu(Central Processing Unit)子系统 CPU 的占用主要取决于什么样的资源正在 CPU 上面运行,
比如拷贝一个文件通常占用较少CPU,只是在完成拷贝以后给一个中断让CPU知道拷贝已经完成科学计算通常占用较多的CPU,大部分计算工作都需要在CPU上完成,内存、硬盘等子系统只做暂时的数据存储工作
要想监测和理解CPU的性能需要知道一些的操作系统的基本知识,比如:中断,进程调度,进程上下文切换,可运行队列等cpu单核在同一个时间点只能干一件事,但单核CPU一样可以跑多任务操作系统,其实就是分CPU资源(时间片)CPU很无辜,是个任劳任怨的打工仔,每时每刻都有工作在做(进程、线程)并且自己有一张工作清单(可运行队列),
由老板(进程调度)来决定他该干什么,他需要和老板沟通以便得到老板的想法并及时调整自己的工作  (上下文切换),
部分工作做完以后还需要及时向老板汇报(中断),
所以打工仔(CPU)除了做自己该做的工作以外,还有大量时间和精力花在沟通和汇报上。中断  设备通知内核,完成了一次数据处理过程。也可以理解为:cpu停止下来去执行别的指令。例如:完成一次IO。或者完成一次网络数据包的发送。内核处理过程 --- 控制优先级,进行任务调度。用户进程上下文切换 --- 把正在占用cpu的进程放回队列中(每次内核的上下文切换,资源被用于关闭在CPU寄存器中的线程和放置在队列中)运行队列那么监测CPU性能的底线是什么呢?通常我们期望我们的系统能到达以下目标:CPU利用率,如果CPU有100%利用率,那么应该到达这样一个平衡:65%-70% User Time,30%-35% System Time,0%-5% Idle Time;上下文切换,上下文切换应该和 CPU 利用率联系起来看,如果能保持上面的 CPU 利用率平衡,大量的上下文切换是可以接受的;云(虚拟化)  提高资源利用率查看cpu信息
# cat /proc/cpuinfo   --能看到指令集,CPU核数,频率,缓存等相关信息
# lscpu要采集CPU当前正在运行的信息数据,要用到下面的命令或者监控软件(nagios,zabbix等)
top
uptime
vmstat
mpstat --需要yum install sysstat
sar  --需要yum install sysstat# vmstat 2      每2秒钟采集一下数据
# vmstat 2 3    每2秒钟采集一次,一共采集3次# vmstat 2
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st1  0      0  78112  63432 1519100    0    0   233    18 1906 1190 26 13 59  1  01  0      0  78112  63432 1519100    0    0     0     0 4180 1378 33 17 50  0  01  0      0  78112  63440 1519092    0    0     0    30 4284 1706 33 17 50  0  0
r   可运行队列。单核cpu,不应该超过3(经验得到的数据,只是表明大于这个值表明运行队列有点长)
b   当前被阻塞的进程,一般这些进程都是在等待某些外部资源而被阻塞。>3需要注意,而且一直出现或者经常出现,就更值得注意
in  中断数。一般代表大量设备操作成功通知内核。
cs  上下文切换。一般代表任务需要紧急被cpu处理。数字高,只能说明内核在充分发挥它的任务调度作用。不能简单通过该数字判断cpu就出现瓶颈。
us  用户进程所占用的cpu时间的百分比
sy  内核在进行任务调度所占用的cpu时间的百分比
id  cpu空闲所占用的时间百分比.仅仅0不能简单判断cpu出现瓶颈,只能说它被充分被留用。
wa  等待IO所消耗时间百分比
st  被硬件虚拟化的虚拟机所消耗掉的时间百分比mpstat 和 vmstat 类似,不同的是 mpstat 可以输出多个处理器的数据# mpstat  -P ALL 1    ---P ALL表示查看所有CPU核, 1表示每一秒显示一次
10:46:35 AM  CPU   %user   %nice    %sys %iowait    %irq   %soft  %steal   %idle    intr/s
10:46:36 AM  all   26.13    0.00    6.53    0.00    3.52    9.05    0.00   54.77  19478.22
10:46:36 AM    0   25.74    0.00    6.93    0.00    2.97    7.92    0.00   56.44   9740.59
10:46:36 AM    1   26.73    0.00    6.93    0.00    3.96   10.89    0.00   51.49   9739.60# sar -u  查看cpu相关的历史数据    --这是历史数据,是每十分钟会去采集一次系统相关的数据
# sar -u 2 3    --两秒一次,显示三次(不是历史数据,是当前动态数据)sysstat  --> 提供 sar 命令       (system activity reporter)sar的特点:可以对过去时间的系统状态进行分析,但不能对某个进程进行深入分析,只能对系统的整体情况进行分析。yum install sysstat   -y      # systemctl start sysstat
# systemctl enable sysstat安装systat包后,就会自动在 /var/log/sa/saxx 产生数据   xx代表日期
可以使用sar -f /var/log/sa/saxx  去访问  加参数就可以访问不同类型的性能数据指定查询之前的日期与固定时间点的方法sar -u -f /var/log/sa/sa18 --查看这个月已经过的18号的cpu历史数据sar -u -f /var/log/sa/sa18  -s 09:00:00 -e 10:00:00   --指定只看18号9点到10点的cpu历史数据保存性能数据
sar支持保存成两种格式的文件,一种是文本文件,一种是二进制文件 (只有通过sar自己的命令 -f 参数 才能看)保存为文本文件,可以直接cat命令查看
sar -p 1 5 > /tmp/test/sar1.txt保存为二进制文件
sar -p  1 5  -o /tmp/test/sar2.txt 1>/dev/null       --会显示到屏幕,可以用1>/dev/null
file /tmp/test/sar2.txt      --是data类型文件
sar -f /tmp/test/sar2.txt     --使用-f参数读取  可以通过做实验,再来用vmstat,mpstat,sar来看cpu的变化如:执行下面的sh /tmp/2.sh脚本,产生一百个运算的进程
[root@li ~]# cat /tmp/1.sh
#!/bin/basha=1
sum=0
while true
dosum=$[$sum+$a]let a++
done
[root@li ~]# cat /tmp/2.sh
#!/bin/bashfor i in `seq 100`
dosh /tmp/1.sh &
done=================================================================总结:现在的架构cpu极少会成为瓶颈.就算是真的cpu成为了瓶颈,对cpu能做的优化太少了(要么就换硬件,要么通过扩展架构来分担压力,杀掉无用并且占用资源的进程)系统管理员能改的也就只有进程优先级了nice  优先级    能调的范围是 -20到19   -20表示优先级最高,19最低用户运行一个程序默认给的优先级为0renice    对一个已经运行的进程进行nice值的调整renice 19  pid[root@li ~]# vim /tmp/test.sh a=1while [ $a -lt 1000000 ]
dolet a++
donenice 优先级高的能够优先分配资源,跑得快,花费的时间少,负载越高,效果越明显实验
在一个负载高的情况下做效果更好,比如一个大文件的cp第一个终端:
[root@li ~]# time sh /tmp/test.sh real    0m39.363s
user    0m26.338s
sys     0m0.900s第二个终端:
[root@li ~]# time nice --19 sh /tmp/test.sh    --19 第一个是参数的横杠,第二个是负号real    0m26.881s
user    0m26.008s
sys     0m0.871s--对比上面的时间,可以看到 高优先级的花费的时间少可以把上面的实验再做一次,马上用top查出-19的pid值,并使用renice修改renice 19  9683[root@li ~]# time sh /tmp/test.sh real    0m34.665s
user    0m26.277s
sys     0m0.896s[root@li ~]# time nice --19 sh /tmp/test.sh
real    0m37.231s
user    0m26.094s
sys     0m0.905s--从上面的时间可以看出,-19优先级的半路被改为19后,所花费的时间反而多了注意:只有管理员才能把优先级往高调,普通用户只能调自己的,并且只能往低调,调低后还不能再调高====================================================================

Linux系统优化基础和系统监控相关推荐

  1. linux+系统优化基础,linux系统优化基础

    linux系统优化基础 tags: linux 优化 kingle --- ### 1, 查看centos版本:cat etc/redhat-release 看看centos架构信息:uname -m ...

  2. Linux下常用的系统监控软件

    转载:http://blog.chinaunix.net/uid-25266990-id-3380929.html Linux下常用的系统监控软件有Nagios.Cacti.Zabbix.Monit等 ...

  3. linux 系统优化基础,Linux系统基础优化总结

    请称呼我搬运工,哈哈 优化综合 https://www.cnblogs.com/yinshoucheng-golden/p/6149556.html (1)不用root管理,以普通用户的名义通过sud ...

  4. linux+系统优化基础,Linux入门基础(三):Linux用户及权限基础

    用户基础 用户和组 每个用户都拥有一个userid 每个用户都属于一个主组,属于一个或多个附属组 每个组拥有一个groupid 每个进程以一个用户身份运行,受该用户可访问资源限制 每个可登陆用户拥有一 ...

  5. 寒冰linux视频教程笔记8 系统监控

    了解系统状况 uname 显示系统信息:uname -a hostname 显示主机名 last  列出最近用户登录 lastlog 列出每一个用户的最近登录状况 free 显示内存使用状况  vms ...

  6. Linux操作系统基础 Intel32位系统架构总览

    前言 说是Linux操作系统基础,其实应该是Intel IA-32架构,但是以学习Linux操作系统为目的,故而称为<Linux操作系统基础>.本部分开始主要讲解80x86保护模式下基本概 ...

  7. linux系统基础与应用,Linux操作系统:基础、原理与应用

    <Linux操作系统:基础.原理与应用> 第1部分基础篇 第1章操作系统概述/3 1.1认识操作系统3 1.1.1操作系统的概念3 1.1.2操作系统的功能4 1.2操作系统的发展与现状5 ...

  8. 【嵌入式Linux应用开发】温湿度监控系统——绘制温湿度折线图

    1. 概述 ​ 本篇的主要内容是使用SquareLine Studio绘制一个显示温湿度曲线图的表格,将其移植到100ASK STM32MP157开发板上显示,效果图如图所示: 温湿度监控系统应用开发 ...

  9. 【嵌入式Linux应用开发】温湿度监控系统——多线程与温湿度的获取显示

    1. 概述 ​ 在前几篇的文章中,我们已经学习了LVGL界面绘制以及paho mqtt的同步客户端和异步客户端的操作,那么本篇就会综合前面的知识,加上Linux系统的多线程以及线程间通信的知识,将LV ...

最新文章

  1. lograotate 配置常用配置
  2. 减少代码中该死的 if else 嵌套
  3. C语言文件操作基本常识
  4. Android之UI线程与子线程交互设计的5种方法
  5. Java NIO原理图文分析及代码实现
  6. 聚划算百亿补贴上线新iPhone SE 售价2799元
  7. android顶部标题app_name,如何写一个app通用的title
  8. java迷宫算法继承_求Java关于迷宫的算法(用栈实现)
  9. json与对象如何进行相互转换
  10. 普林斯顿微积分读本篇十二:洛必达法则
  11. sonar pmd\p3c插件源码初步解析
  12. C#数据结构与算法 培训视频
  13. pcb外观维修_5种最常见的PCB维修
  14. 这本书非常值得一读!《微习惯》读后感
  15. java基于ssm的在线装机DIY系统的分析与设计
  16. 用计算机弹国王与乞丐,国王与乞丐 MIDI File Download :: MidiShow
  17. python计算排列组合
  18. 海洋cms常见问题有哪些?
  19. html 表格选择滚动条,table设置tbody滚动条
  20. ecplise提示:“The selection cannot be launched, and there are no recent launches.”

热门文章

  1. mac os 10.12 Sierra 连接 惠普 M1136 MFP 打印机,通过 samba 协议,安装驱动,连接打印机...
  2. 把win7电脑变成无线路由器
  3. 7-6 输出三角形面积和周长 (15分)
  4. python将10到1递减_基本递减循环 - PYTHON
  5. tl494c封装区别_TL494的特点与引脚功能
  6. Python循环练习-货币兑换
  7. 如何去除电镀废水中的铬、镍、铜
  8. RMA( 退货)的业务流程
  9. 传奇服务器的爆率文件在哪里,传奇私服爆率调整
  10. MySQL索引基础续