Linux 进程调度

调度程序是内核中确保进程能有效工作的子系统,负责决定将哪个进程投入运行,何时运行以及运行多少时间。调度程序的合理调度,是将系统资源最大限度发挥的保证。
2018/06/03 00:09 am posted in  Linux

Linux 进程管理

最近开始对 Linux 进行一次比较深入的学习,对于一个操作系统来说,提供运行程序的能力是其本质,而在 Linux 中,轻量、相应快速的进程管理也是其优良特性之一。我会分两篇文章介绍 Linux 进程。这是第一篇,重点在于 Linux 进程的描述、和生命周期,下一篇将介绍 Linux 下的进程调度。
2018/05/19 00:23 am posted in  Linux

Linux下常用命令

看见老五博客里有这么一篇博客,赶快转来备忘!!。@tTop5

说明:所有命令是在Centos 6.4 64位的虚拟机系统进行测试的。本文介绍的命令都会在此Centos下运行验证(也有部分命令会在suse/ubuntu系统里测试的,会做特明说明),但运行结果就不再列出了。 硬件篇 CPU相关

lscpu #查看的是cpu的统计信息. cat /proc/cpuinfo #查看CPU信息详细信息,如每个CPU的型号,主频等

内存相关

free -m #概要查看内存情况 这里的单位是MB cat /proc/meminfo #查看内存详细信息

磁盘相关

lsblk #查看硬盘和分区分布,显示很直观 df -h #查看各分区使用情况 cat /proc/partitions #查看硬盘和分区 mount | column -t #查看挂接的分区状态

网卡相关

lspci | grep -i 'eth' #查看网卡硬件信息ifconfig -a #查看系统的所有网络接口 ethtool eth0 #如果要查看某个网络接口的详细信息,例如eth0的详细参数和指标

软件篇 内核相关

uname -a #查看版本当前操作系统内核信息 cat /proc/version #查看当前操作系统版本信息 cat /etc/issue #查看版本当前操作系统发行版信息 cat /etc/redhat-release #同上 cat /etc/SuSE-release #suse系统下才可使用 lsb_release -a #用来查看linux兼容性的发行版信息 lsmod #列出加载的内核模块

网络

ifconfig #查看所有网络接口的属性iptables -L #查看防火墙设置 service iptables status #查看防火墙状态 service iptables stop #关闭防火墙 route -n #查看路由表 netstat -lntp #查看所有监听端口 netstat -antp #查看所有已经建立的连接 netstat -s #查看网络统计信息进程 netstat -at #列出所有tcp端口 netstat -au #列出所有udp端口 netstat -lt #只列出所有监听tcp端口

系统管理

top #查看系统所有进程的详细信息,比如CPU、内存等,信息很多! df -lh #查看硬盘大小及使用率 mount #挂接远程目录、NFS、本地共享目录到linux下 hostname #查看/修改计算机名 w #查看活动用户 id #查看指定用户信息 last #查看用户登录日志 cut -d: -f1 /etc/passwd #查看系统所有用户 cut -d: -f1 /etc/group #查看系统所有组 crontab -l #查看当前用户的计划任务服务 chkconfig –list #列出所有系统服务 chkconfig –list | grep on #列出所有启动的系统服务程序 rpm -qa #查看所有安装的软件包 uptime #查看系统运行时间、用户数、负载 /sbin/chkconfig --list #查看系统自动启动列表 /sbin/chkconfig –add mysql #把MySQL添加到系统的启动服务组里面

文件相关

ls -lht #列出一个文件夹下所有文件及大小、访问权限 **du -sh ** #查看指定目录的大小 **du -lh ** #查看指定目录及各文件的大小 ln -s #建立软链接

进程相关

pstree -p pid #查看一个进程下的所有线程 pstree -a #显示所有进程的所有详细信息,遇到相同的进程名可以压缩显示。 ps -ef #查看所有进程 kill -9 pid #杀死进程 kill all test #杀死进程 kill -9 pgrep test #杀死进程 ./test.sh & #使程序在后台运行 nohup ./test.sh & #使程序在后台运行

压缩解压缩

zip -r dir.zip dir file #将目录dir、文件file等压缩到zip包,zip -re dir.zip dir file #创建zip包,且加密 unzip dir.zip #解压 tar -zcvf dir.tar.gz dir file #将目录dir、文件file等压缩到tar包 tar -xf dir.tar.gz #解压

screen命令 screen命令组最大的好处就是当你的shell退出或关闭后,你运行的服务不会关系,也就是说,我们可以在screen里开启一组服务,且不受终端断开的影响。

screen -S test #创建一个名字为test的screen screen -r test #打开名字为test的screen screen -r pid #打开进程号为pid的screen screen -ls #列出所有的screen ctrl + a,d #当在一个screen时,退出screen ctrl + a,n #当在一个screen时,切换到下一个窗口 ctrl + a,c #当在一个screen时,创建一个新的窗口

scp命令

scp local_file remote_username@remote_ip:remote_dir #拷贝本地文件到远程机器上 scp -r local_dir remote_username@remote_ip:remote_dir #拷贝本地整个目录到远程机器上

软件包安装管理命令 假设你想要安装的软件包叫做app,注意,这里的命令通常需要sudo或者root权限。

//centos系统、redhat系统 rpm -qa | grep app #查找本机是否安装了app; rpm -ivh app.rpm #假设你有app的rpm包,这样直接安装 sudo yum install app #否则就在线安装 yum update app #更新app rpm -e app #删除已安装的app包 //suse、opensuse系统 zypper search app #查找本机是否安装了app; zypper install app #安装 zypper update app #更新 zypper remove app #删除 zypper lr #列出所有已定义的安装源。 zypper ar #添加新安装源。 zypper rr #删除指定的安装源 zypper mr #修改指定的安装源 //ubuntu系统 apt-get install app #安装 apt-get update app #更新 apt-get remove app #删除 apt-cache search app #搜索软件包 dpkg -i app.deb #假设你有app的deb包,这样直接安装

2017/07/29 10:41 am posted in  Linux

Linux下常用的dd命令

今天在微博看到了关于服务器硬盘负载的测试(原文见:使用 dd 命令进行硬盘 I/O 性能检测),前一段时间在搭建Minecraft服务器,我就经常怀疑IO爆表,但是内存可以用free,CPU和内存可以用top,可IO怎么查,我怎么知道这台服务器到底是哪里爆表了。 文章里提出用dd进行硬盘写入操作,通过写入情况分析现在负载到了一个什么程度。

但是,我并不太敢认可这种做法,这种做法就像判断瓶子满没满,再向里面注入写就知道了。但我目前并没有其他能看出磁盘当前性能的办法,暂且认可。因为如果瓶子已经满了,这些注入岂不是又增加负担。 也许我的担忧是在我无法负担更好的VPS的基础上的吧,就像好多朋友已经现在游戏服务器上玩的happy,我想看下服务器IO当前性能,结果一个dd就把服务器搞崩了,全线玩家集体掉线,也是挺无语。

继续说dd命令,之前看过一篇关于介绍新手级命令的文章(原文见:对 Linux 新手有用的 20 个命令),因为已经接触linux有一段时间了,几乎对这些命令用了不知多少遍了,唯独dd,之前就用过一次,就是帮同学写镜像,好像还写砸了。 dd的作用事把指定的输入文件拷贝到指定的输出文件中,并且在拷贝的过程中可以进行格式转换。现在就说下dd的常用用法。 先说下dd的语法和参数:

  • if =输入文件(或设备名称)。
  • of =输出文件(或设备名称)。
  • ibs = bytes 一次读取bytes字节,即读入缓冲区的字节数。
  • skip = blocks 跳过读入缓冲区开头的ibs*blocks块。
  • obs = bytes 一次写入bytes字节,即写 入缓冲区的字节数。
  • bs = bytes 同时设置读/写缓冲区的字节数(等于设置obs和obs)。
  • cbs = bytes 一次转换bytes字节。
  • count = blocks 只拷贝输入的blocks块。
  • conv = ASCII 把EBCDIC码转换为ASCII码。
  • conv = ebcdic 把ASCII码转换为EBCDIC码。
  • conv = ibm 把ASCII码转换为alternate EBCDIC码。
  • conv = blick 把变动位转换成固定字符。
  • conv = ublock 把固定们转换成变动位
  • conv = ucase 把字母由小写变为大写。
  • conv = lcase 把字母由大写变为小写。
  • conv = notrunc 不截短输出文件。
  • conv = swab 交换每一对输入字节。
  • conv = noerror 出错时不停止处理。
  • conv = sync 把每个输入记录的大小都调到ibs的大小(用ibs填充)。

1.对硬盘(西数黑盘)进行测试:

hypo@Hypo-TP:~$ dd if=/dev/zero of=test.img bs=512M count=4 oflag=dsync
记录了4+0 的读入
记录了4+0 的写出
2147483648字节(2.1 GB)已复制,19.7395 秒,109 MB/秒
hypo@Hypo-TP:~$ dd if=/dev/zero of=test.img bs=1G count=1 oflag=dsync
记录了1+0 的读入
记录了1+0 的写出
1073741824字节(1.1 GB)已复制,9.12763 秒,118 MB/秒

可以看到写入延时和写入速度。 其中/dev/zero事unix和linux下设计的白洞,可以源源不断的提供null字节,而也有一个unix和Linux的黑洞,那就是/dev/null。 2.写iso镜像:

sudo dd if=archlinux-2015.03.01-dual.iso of=/dev/sdd && sync
记录了1218560+0 的读入
记录了1218560+0 的写出
623902720字节(624 MB)已复制,0.910181 秒,685 MB/秒

3.备份整个磁盘,比如:

dd if=/home of=home.img bs=4M

4.备份MBR 备份: 备份磁盘开始的512Byte大小的MBR信息到指定文件:

dd if=/dev/hdx of=/path/to/image count=1 bs=512

恢复: 将备份的MBR信息写到磁盘开始部分:

dd if=/path/to/image of=/dev/hdx

5.修复硬盘 当硬盘较长时间(比如一两年年)放置不使用后,磁盘上会产生magnetic flux point。当磁头读到 这些区域时会遇到困难,并可能导致I/O错误。当这种情况影响到硬盘的第一个扇区时,可能导致 硬盘报废。下面的命令有可能使这些数据起死回生。且这个过程是安全,高效的。

dd if=/dev/sda of=/dev/sda

6.销毁磁盘数据 利用随机的数据填充硬盘:

dd if=/dev/urandom of=/dev/hda1

在某些必要的场合可以用来销毁数据。执行此操作以后,/dev/hda1将无法挂载,创建和拷贝操作无法执行。

2015/08/28 10:42 am posted in  Linux

挂载新硬盘扩容/home

我的电脑是两块硬盘,一块是三星的120G固态,一块是希捷的750G的机械。之前是主要用Windows系统,就把系统放在SSD里,机械作为补充。因为自从退队(应该是退队前一个月)就无情的抛弃的视窗(23333),然后转身投到Linux的怀抱(233333)。 当时没有顾虑太多,依然是按照Win的类似的分区方式,加上机械里面满满的东西,也就不打算动它。之前的分区方式:

Device     Boot    Start       End   Sectors  Size Id Type
/dev/sdb1  *        2048  80001023  79998976 38.2G 83 Linux
/dev/sdb2       80003070 234440703 154437634 73.7G  5 Extended
/dev/sdb5       80003072  84000767   3997696  1.9G 82 Linux swap / Solaris
/dev/sdb6       84002816 234440703 150437888 71.8G 83 Linux

一SSD为主,/和home都在里面,而机械纯粹作为数据仓库使用,当时就感觉可能会遇到home不够用的情况,但为了速度,也没做很多东西,直到今天,我看到这个:

/dev/sdb6       73907416  61589776   8540312   88% /home

这就呵呵, 然后我就决定把原有的NTFS格式的机械挂在到home中以到达缓解home压力和扩容的目的。 经过一个下午的数据倒换和整理,吃晚饭后,终于可以进行了。

1.重新分区(格式化)

首先要做的就是换个能让linux完美兼容的格式,本来想直接格式化,想想不如直接重新分区了。 首先要解除挂载:

sudo umount /dev/sda1

然后通过fdisk命令删除分区并新建分区

hypochen@HypoChen-TP:~$ sudo fdisk /dev/sda

删除:d命令 新建:n命令 之后新建了四个分区: p命令可以查看:

Device     Boot      Start        End   Sectors  Size Id Type
/dev/sda1             2048  419432447 419430400  200G 83 Linux
/dev/sda2        419432448  838862847 419430400  200G 83 Linux
/dev/sda3        838862848 1258293247 419430400  200G 83 Linux
/dev/sda4       1258293248 1465149167 206855920 98.7G 83 Linux

然后格式化,

sudo mkfs -t ext3 /dev/sdaX(X为序号)

然后就是挂载操作了,不能直接将磁盘挂载到home下,因为挂载之后无法获得写入权限,只能先挂载到mnt下:

hypochen@HypoChen-TP:~$sudo mkdir -p /mnt/VirtualBox
hypochen@HypoChen-TP:~$sudo mkdir -p /mnt/Data
hypochen@HypoChen-TP:~$sudo mkdir -p /mnt/Video
hypochen@HypoChen-TP:~$sudo mkdir -p /mnt/Project

在mnt下新建几个个文件夹,然后挂载:

hypochen@HypoChen-TP:~$ sudo mount /dev/sda1 /mnt/VirtualBox/
hypochen@HypoChen-TP:~$ sudo mount /dev/sda2 /mnt/Data/
hypochen@HypoChen-TP:~$ sudo mount /dev/sda3 /mnt/Video/
hypochen@HypoChen-TP:~$ sudo mount /dev/sda4 /mnt/Project/

修改新建文件夹的权限:

hypochen@HypoChen-TP:~$ sudo chmod 777 /mnt/Data/
hypochen@HypoChen-TP:~$ sudo chmod 777 /mnt/VirtualBox/
hypochen@HypoChen-TP:~$ sudo chmod 777 /mnt/Video/
hypochen@HypoChen-TP:~$ sudo chmod 777 /mnt/Priject/

然后修改fstab文件:

sudo gedit /etc/fstab

在文件的后面添加:

/dev/sda1 /mnt/VirtualBox  ext3  relatime    0  2
/dev/sda2 /mnt/Data  ext3  relatime    0  2
/dev/sda3 /mnt/Video  ext3  relatime    0  2
/dev/sda4 /mnt/Project  ext3  relatime    0  2

保存文件之后使用命令:

sudo mount -a

使得挂载生效。 最后做一个软链接:

hypochen@HypoChen-TP:~$ ln -s /mnt/VirtualBox/ VirtualBox
hypochen@HypoChen-TP:~$ ln -s /mnt/Data/ Data
hypochen@HypoChen-TP:~$ sudo ln -s /mnt/Video/ Video
hypochen@HypoChen-TP:~$ sudo ln -s /mnt/Project/ Project

然后就完成了。。。

2015/05/18 10:40 am posted in  Linux