#ls -i
24229218 go  805308641 -w,

这样删不掉:
#rm -i 805308641
rm: cannot remove ‘805308641’: No such file or directory


这样删才行:
find ./* -inum 805308641 -delete


来自:https://blog.csdn.net/wb736/article/details/79756956

Macbook:
find ./* -inum 1442584 |xargs rm -f #样例,使用find和xargs结合删除ddd文件(无法使用-i参数进行删除确认)
mac本下实践Ok如下:
echo  `find ./* -inum 22266353 `
./-p
rm -f  `find ./* -inum 22266353 `   #成功删除

find ./* -inum 22266353 -exec rm -i {} \;
rm: ./-p: is a directory
find ./* -inum 13287477 -exec rm -r -i {} \;   #成功删除
remove ./~? y
现象:init 0 关闭系统 出现错误提示,阿里专有云的运维兄弟反馈说是没有完全关闭:
再登录下:runlevel  ,说是操作系统bug。
来自:https://developer.aliyun.com/ask/107789?spm=a2c6h.13159736
#mv libzip.so.5 /tmp/.
mv: overwrite ‘/tmp/./libzip.so.5’? y

[root@rpmbuild_server_bj_yz_10_10_0_158:/usr/local/libzip/lib]
#ls
libzip  libzip.a  libzip.la  libzip.so  libzip.so.5.0.0  pkgconfig

[root@rpmbuild_server_bj_yz_10_10_0_158:/usr/local/libzip/lib]
#ls
libzip  libzip.a  libzip.la  libzip.so  libzip.so.5.0.0  pkgconfig

[root@rpmbuild_server_bj_yz_10_10_0_158:/usr/local/libzip/lib]
#ldconfig  -v|grep libzip
ldconfig: Can't stat /libx32: No such file or directory
ldconfig: Path `/usr/lib' given more than once
ldconfig: Path `/usr/lib64' given more than once
ldconfig: Can't stat /usr/libx32: No such file or directory
/usr/local/libzip/lib:
        libzip.so.5 -> libzip.so.5.0.0 (changed)

=========================================
CentOS 7编译安装PHP 7.4提示 libzip 版本问题:
https://blog.csdn.net/tan88881111/article/details/121599297

报错提示非常明显,配置程序没有找到libzip库,你用yum安装libzip-devel的话,安装的版本是0.10,版本达不到要求。所以,此时我们需要卸载掉yum安装的libzip然后手动安装新版。
/usr/local/libzip/lib:
        libzip.so.5 -> libzip.so.5.0.0

[root@rpmbuild_server_bj_yz_10_10_0_158:/tmp/php-7.3.16]
#cd /usr/local/libzip/lib

[root@rpmbuild_server_bj_yz_10_10_0_158:/usr/local/libzip/lib]
#ls
libzip  libzip.a  libzip.la  libzip.so  libzip.so.5  libzip.so.5.0.0  pkgconfig


checking libzip... yes

Please reinstall the libzip distribution
checking for libzip... not found
configure: error: Please reinstall the libzip distribution

vim ./configure
追踪$LIBZIP_LIBDIR,发现它是一个lib库:
  save_old_LDFLAGS=$LDFLAGS
  ac_stuff="
      -L$LIBZIP_LIBDIR
    "

再向上查找:


再向上找这个LIBZIP_LIBDIR变量的来源:





checking libzip... =================
echo $LIBZIP_LIBDIR



PHP旧版本,我这编译php55/   php56/   php7/   php71/  php72/ 都没有出现这个问题,php73出现了这个问题。


configure: error: Please reinstall the libzip distribution
rpm -ql libzip-devel|grep -v man
/usr/include/zip.h
/usr/include/zipconf-64.h
/usr/include/zipconf.h
/usr/lib64/libzip
/usr/lib64/libzip.so
/usr/lib64/libzip/include
/usr/lib64/libzip/include/zipconf.h
/usr/lib64/pkgconfig/libzip.pc
出现:
configure: error: Please reinstall the libzip distribution

于是:
yum install -y libzip-devel

编译PHP时出现新问题:
checking for libzip... configure: error: system libzip must be upgraded to version >= 0.11
error: Bad exit status from /root/rpmbuild/tmp/rpm-tmp.gsrSs0 (%build)
经过源码安装是最新的版本,解决办法:


再重新编译PHP7.3,后终于成功完成编译。


cat /usr/local/lib/pkgconfig/libzip.pc


find /usr/local/include/ -name "zip.h"
/usr/local/include/zip.h

rpm -qf /usr/local/include/zip.h
file /usr/local/include/zip.h is not owned by any package

rpm -qf /usr/local/include/zipconf.h
file /usr/local/include/zipconf.h is not owned by any package


ldd /usr/local/php/bin/php |grep libzip   #php 7.3.12
        libzip.so.5 => /usr/local/lib/libzip.so.5 (0x00007f3be1b38000)

旧的php,PHP 7.1.6,无任何返回:ldd /usr/local/php/bin/php |grep libzip


以上实践摘取自 :https://www.php.cn/php-weizijiaocheng-414091.html
https://blog.csdn.net/liuyeluoqing/article/details/81697954
https://blog.qzze.com/820.html


CentOS6.X上rpmbuild  -ba memcache-php73-4.0.5.el6.x86_64.spec
出现error: Autoconf version 2.64 or higher is required  :
https://blog.51cto.com/11736068/2110670
yum install xsel
=================================================================================================================================================================================
Package                                 Arch                                      Version                                         Repository                               Size
=================================================================================================================================================================================
Installing:
xsel                                    x86_64                                    1.2.0-15.el7                                    epel                                     24 k

Transaction Summary
==================================================================================================
Install  1 Package

Total download size: 24 k
Installed size: 39 k
ls ~+/php-7.3.12.tar.gz |xsel
xsel: Can't open display: (null)
: Inappropriate ioctl for device


实践来源:https://blog.csdn.net/qwfys200/article/details/82624336
背景:做开发时经常会遇到在当前目录打开终端的情况,一直都是先启动终端,然后再切换到当前目录,今天发现了一个新的方法,虽然不是一步到位,但比以前快多了。

打开finder,在屏幕的左上角菜单里:访达、服务、服务偏好设置...、快捷键Tab里:
选择其中的“新建位于文件夹位置的终端窗口”菜单项就会打开终端,打开后终端的当前工作目录就是文件夹的路径。一定要点中文件夹,右击空白地方弹出的右键菜单是不会有“服务”项的。

点击该项还可以为该操作设置快捷键:
点击弹出的服务偏好设置窗口中的“服务”并勾选“新建位于文件夹位置的终端窗口”;点击该项还可以为该操作设置快捷键。

使用:control+option+command+.  #打开iterm终端,这个没有go2shell图标那个好用在只能在文件夹上使用,往往我们所谓的开发人员都是在文件夹里面想打开命令行。go2shell新版本使用不了了哟 https://jackxiang.com/post/10365/


来自:https://www.cnblogs.com/xqnq2007/p/7258428.html
解决Tomcat catalina.out 不断成长导致档案过大的问题:https://www.cnblogs.com/zhuawang/p/5053537.html

tomcat修改默认日志catalina.out的路径,来自:https://www.cnblogs.com/galsnag/p/11172002.html
cdto版本有关,最新版的cdto如3.1.3得最新的macOS,实践发现3.0版本在mac air本11.7版本上的big sur上能用:
https://github.com/jbtule/cdto/releases
v3.0 (broken)
Only terminal.app version, I don't use the others, feel free to fork.
Notarized, so I think it should work on Catalina. (Tested on mojave)
cdto_3_0.zip:


最新版本的bigsur也能用:
Go2Shell 没有升级,没有办法,就直接找来了一个替代品。cd to, 下载入口如下:https://mac.softpedia.com/get/System-Utilities/cdto.shtml  ,安装方法一样,选iterm2那个放到程序目录里,按下command拖动到finder上成后即可使用。

Download:  https://us.softpedia-secure-download.com/dl/beb0c85587fe7d89c69546c8234ab4b3/5df849aa/400023757/mac/System-Utilities/cdto_2_6.zip

以上来自:https://juejin.im/post/5cfe82e15188252b1b0366e6



===========废弃=======
用法
安装go2shell后,打开finder的application文件夹,找到go2shell
按住command,用鼠标将go2shell拖到finder的toolbar上(一定要按住command,否则无法拖到上面去的。)
到这里安装设置完成。
如果要修改默认terminal,比如你想要在finder上点击go2shell,打开的是iterm2 而不是默认的terminal。

打开finder , 点击go2shell,设置默认iterm
而Go2Shell默认没有设置界面,需要用命令行打开(隐藏得真深啊!)
在打开的terminal中,输入: open -a Go2Shell —args config
在弹出框中选择 iterm2

吐槽一下:
推荐在App Store下载旧版本,因为官方网站最新版本已经变了,打开Go2Shell变成了设置界面,虽然不用再输入命令打开设置界面了,但是,事实上这变得更加坑了!
因为不能配合Alfred 和 Manico了!!!那还有个软用?

实践结果: 新的Mac版本用旧的go2shell图标上有一个横杠还是不能用,估计苹果自己想做到OS里去吧?譬如,mac 当前位置打开终端 :https://jackxiang.com/post/10367/


链接:https://www.jianshu.com/p/88c6e68645c4
更多:https://www.cnblogs.com/juking/p/7257251.html
下载:https://zipzapmac.com/Go2Shell



macOS 升级到 Catalina之后,使用SecureCRT报如下错误

The permissions on the "/cores" directory need to be changed to
include write permission for "other".

Please execute (or ask an admin to execute) the following from a
terminal window:

sudo chmod go+w /cores

If you would prefer not to change the permissions on the /cores
folder, you can turn off the Global option "Create core file when
application crashes".



应该是macOS的权限控制严格了,导致CRT没有权限访问/cores文件夹,这里关掉CRT崩溃时创建core转储文件即可(实践发现:这个项是没有 checked的,还是老老实实的执行sudo chmod o+w /cores命令后重启后secureCRT就好了。)

Option --> Global Options 取消 Create core file when application crashes 前面的复选框选择即可

来自:https://blog.90.vc/archives/93.html
背景:chrome和secureCRT 开多个窗口时需要不同程序间的切换,快捷键的问题。

一)Mac同一应用打开两个:
open -n /Applications/SecureCRT.app

二)Mac同一应用打开两个,切换快捷键:
command + ~

不同程序之间的窗口切换快捷键是:command + tab,四个手指向上推动在控制板上,然后就能看到多个应用程序,进行切换。

但是我们经常在同一个程序中打开多个窗口,比如:safari,chrome,finder 等,这时候可以试下 command + ~,该快捷键可以实现同程序不同窗口之间的循环切换

From:https://professor-falken.com/zh/mac/como-abrir-varias-veces-la-misma-aplicacion-en-mac-os-x/
        https://blog.csdn.net/JWheat/article/details/79965592
链接:https://www.jianshu.com/p/b2aa15362c4f


三)mac下面打开commands向多个终端发消息的快捷键:
option+command+M  :session manage,定位到左侧服务器列表。
option+command+G  :向各个终端发送命令(可同时发送)
command+I:                从会话管理里过滤出IP。
command+R:               直接输入IP并连接到对应的IP列表。(如果之前访问过,自动连接,否则得输入用户名密码)
+ -:                           打开session manager里的目录,关闭目录。On Mac OS X, you can use "+" to expand all folders and "-" to collapse the selected folder.
想对指针类型里装的地址改动,在函数参数里需要两个**表明它是一个指向指针的指针(也就是传的是指针q的地址) ,ptr_copy(char ** d,char *s){ *d = s;} ,赋值里注意一下是*d =s(*d就是传指针地址的址,不再是值,也就是不会被在函数完成销毁后,外面值不会变,因为传的是指针q的地址。),也就是d里存指针地址*d表示,*d=s,s就是一个地址刚好能赋值。
更多说明帮助理解传参部分:
c语言菜鸟指针传递 问题 void func(char **p) {} int main(void) { char *q=null; func(&q); } p被赋值了神马 为什么俩星号?
p被赋值的是char* p的地址!你把char* 理解为一个变量就好理解了,就好比char a;char是变量类型,a是变量。既然是变量它就有地址,所以p也有地址,char **p,可以看成是 char* (*p)所以char** 被传的值是存放地址的变量的地址!

void func(char **p) {} //函数参数是指向指针的指针
int main(void)
{
char *q=null; //q定义为指针类型
func(&q); //&q,是取q的地址,q是一个指针类型,所以&q就是指针q的地址,即向指针的指针
}

来自:https://zhidao.baidu.com/question/686311732439253092.html


问:运行的以下clang代码,我希望输出ptr3=123与var相同ptr2的结果,但是结果是ptr3=(null)。如何修改我想要的结果代码?

gcc a.c -o a
./a
ptr2=123
ptr3=1PTI

让我们来看看您的“复制”功能:

void ptr_copy(char* d, char* s)
{
    d = s;
}
在函数中,变量d是局部变量。一旦函数返回并d超出范围并终止其生命,对它的分配将丢失。

这使您ptr3在main函数中留下未初始化的变量,使用它会导致未定义的行为 -

如果要复制指针,则需要通过将指针传递给指针本身来模拟按引用传递:

void ptr_copy(char** d, char* s)
{
    *d = s;
}
并称其为

ptr_copy(&ptr3, ptr)

需要的是一个不同的ptr_copy功能,如下所示:

void ptr_copy(char** dst, char* src) {
    (*dst) = src;
}

ptr_copy(&ptr3, ptr);
这个想法是您将内容填充ptr到ptr3存储的位置(因此&ptr3,不是ptr3)。

当您将指针传递给函数时,该指针的值将被传递(即给定指针指向的地址)。因此,d内部ptr_copy的指针不同于(与该指针具有相同的值,但它位于内存的另一部分中)不同的指针。这就是为什么分配,更改地址指向的原因,但是对却没有任何作用。

确实考虑一个功能

void value_copy(int d, int s) {
    d = s;
}
int i1 = 3;
int i3 = 2;
value_copy(i3, i1);
您不希望i3在调用后等于3 value_copy(),对吗?

正确调用如下:




#make a.c
cc     a.c   -o a

#./a
ptr2=123
ptr3=123


来自:https://stackoverflow.com/questions/59084119/copy-string-to-pointer-failed-in-function-in-clang



经GDB调试一下,发现其经过char ** d传参数进入函数后,实现了对传入的指针传址的d进行了修改,返回时也是作了修改,所以能正确指向123,GDB在打印时print ptr就是地址和值,如下:
(gdb) l
8       int main(){
9           char *ptr = "123";
10          char* ptr2;
11          char* ptr3;
12
13          ptr2 = ptr;
14          printf("ptr=%p\n", ptr);
15          printf("ptr2=%p\n", ptr2);
16          ptr_copy(&ptr3, ptr);
17          printf("ptr3=%p\n", ptr3);
(gdb) p ptr
$1 = 0x400670 "123"
(gdb) n
14          printf("ptr=%p\n", ptr);
(gdb) s
ptr=0x400670
15          printf("ptr2=%p\n", ptr2);

(gdb) p ptr
$3 = 0x400670 "123"
(gdb) s
ptr2=0x400670
16          ptr_copy(&ptr3, ptr);
(gdb) s
ptr_copy (d=0x7fffffffe498, s=0x400670 "123") at a.c:5
5           *d = s;
(gdb) p d
$4 = (char **) 0x7fffffffe498
(gdb) s
6       }

(gdb) s
main () at a.c:17
17          printf("ptr3=%p\n", ptr3);
(gdb) p ptr3
$6 = 0x400670 "123"

经过函数的运作,这个ptr,ptr2,ptr3都指向了0x400670,也就是123。
问题,之前以为是redis占用太多内存,后来发现是操作系统有问题:
free -m
             total       used       free     shared    buffers     cached
Mem:          7865       6138       1726          0        326       5110
-/+ buffers/cache:        701       7163

echo 1 > /proc/sys/vm/drop_caches

free -m
             total       used       free     shared    buffers     cached
Mem:          7865        530       7335          0          0         19

===============================================
Linux cached过高问题,手动释放cached

To free pagecache:  echo 1 > /proc/sys/vm/drop_caches

To free dentries and inodes:  echo 2 > /proc/sys/vm/drop_caches

To free pagecache, dentries and inodes:  echo 3 > /proc/sys/vm/drop_caches

来自:https://www.cnblogs.com/yanwei-wang/p/8133888.html
一、Linux下经常会用到ldd查看程序使用了哪些共享链接库,很方便的一个工具,在Mac OS X上没有这个命令,如果想在Mac OS X查看程序使用了哪些链接库可以用otool 来代替。
otool -L  `which nginx`
/usr/local/bin/nginx:
  /usr/local/opt/pcre2/lib/libpcre2-8.0.dylib (compatibility version 12.0.0, current version 12.0.0)
  /usr/local/opt/openssl@1.1/lib/libssl.1.1.dylib (compatibility version 1.1.0, current version 1.1.0)
  /usr/local/opt/openssl@1.1/lib/libcrypto.1.1.dylib (compatibility version 1.1.0, current version 1.1.0)
  /usr/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.11)
  /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1311.100.3)

来自:http://t.zoukankan.com/amoy9812-p-12322060.html



二、Linux中的strace可以查看程序运行时的系统调用,有时对于调试程序很有帮助,Mac OS X中可用dtruss (需要root)替代
sudo dtruss
阅读全文
ss -lnt
LISTEN     0      128                                                     *:57840                                                  *:*

sudo lsof -i tcp:57840  
rpc.statd 1453 rpcuser    9u  IPv4  13387      0t0  TCP *:57840 (LISTEN)

ps -ef|grep 1453          
rpcuser   1453     1  0  2018 ?        00:00:00 rpc.statd

rpm -qf /sbin/rpc.statd
nfs-utils-1.2.3-39.el6.x86_64

ls /etc/init.d/nfs*

/etc/init.d/nfslock status

vi /etc/services
nfs             2049/tcp        nfsd shilp      # Network File System
nfs             2049/udp        nfsd shilp      # Network File System
nfs             2049/sctp       nfsd shilp      # Network File System

找到里面的 nfs ,在前面加 # 注释掉,重启,我直接停掉服务。
/etc/init.d/nfslock stop
Stopping NFS statd:                                        [  OK  ]

来自:https://blog.csdn.net/maxuearn/article/details/79879607
(以下实例用到了assert,请确保php7的zend.assertions=1,或者 php -d "zend.assertions=1" 临时启用进行测试)

cat  process.croutine.php


php -d "zend.assertions=1"  process.croutine.php
hello proc1
proc1 stop
hello proc2
proc2 stop

来自:https://wiki.swoole.com/wiki/page/1061.html
https://jackxiang.com/post/10343/,出现磁盘等待wait较高,如下:
iostat -x 2 5  # %util 出现100,设备是挂载的dm-0
Device:         rrqm/s   wrqm/s     r/s     w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await  svctm  %util
dm-0              0.00     0.00    0.00    0.00     0.00     0.00     0.00     2.00    0.00   0.00 100.00



#dm-0的%utilized 是100.00%,这个很好的说明了有进程正在写入到dm-0磁盘中。
dm是device mapper(设备映射)的意思:
dm-0是个块设备,就是个分区,他被挂载在不同的目录,但是不同目录里的文件却不一样。


实践如何不用重启直接生效/etc/fstab的方法:
修改过/etc/fstab后mount -a 即可生效

      -a, --all
              Mount all filesystems (of the given types) mentioned in fstab.



二)查找iostat与df -h,挂载磁盘dm-0的对应关系。
cd /dev/mapper/
ll
ddf1_4c5349202020202010000055000000004711471100001450p1 -> ../dm-1

dmsetup ls|grep ddf1_4c5349202020202010000055000000004711471100001450p1
ddf1_4c5349202020202010000055000000004711471100001450p1 (253:1)

df -Plh|grep 'ddf1_4c5349202020202010000055000000004711471100001450p1'
/dev/mapper/ddf1_4c5349202020202010000055000000004711471100001450p1  194M   34M  151M  19% /boot

双出现:dm-3              0.00     0.00    0.00    0.00     0.00     0.00     0.00     2.00    0.00   0.00 100.00
df -Plh|grep 'ddf1_4c5349202020202010000055000000004711471100001450p3'
/dev/mapper/ddf1_4c5349202020202010000055000000004711471100001450p3  119G  2.4G  110G   3% /

指向boot目录。
反证:以为是卸载了所有的mount目录iowait就好,实践发现并没有好,负载依然高:




ddf1_4c5349202020202010000055000000004711471100001450p1 通过下面命令也能看:


来自:https://www.iteye.com/blog/andnnl-2236548
磁盘有问题:
sudo badblocks -s -v -o sdbbadblocks.log /dev/sda  #出现一堆的坏块编号

dmesg |less -i     #jbd2,当有硬盘坏道时,通常在dmesg输出的信息中会有 Buffer I/O Error,所以经常检查dmesg的输出可以及时发现是否存在硬盘问题。
NFO: task jbd2/dm-3-8:526 blocked for more than 120 seconds.
      Not tainted 2.6.32-431.el6.x86_64 #1
"echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
jbd2/dm-3-8   D 0000000000000002     0   526      2 0x00000000


查看第2个CPU上的程序定位到jbd2:
|grep -v '\[' 去掉系统服务进程

ps -eo 'pid,psr,cmd' |sort -nk 2|awk '{if($2==2)print }'|grep -v '\['
ps -eo 'pid,psr,cmd' |sort -nk 2|awk '{if($2==2)print }'|grep  '\['

ls -l /dev/dm-3
brw-rw---- 1 root disk 253, 3 Nov 11 14:59 /dev/dm-3

ps -LF -p 526   #看它的主进程
UID        PID  PPID   LWP  C NLWP    SZ   RSS PSR STIME TTY          TIME CMD
root       526     2   526  0    1     0     0   2 Nov11 ?        00:00:00 [jbd2/dm-3-8]

lsof -nPp 526
COMMAND   PID USER   FD      TYPE DEVICE SIZE/OFF NODE NAME
jbd2/dm-3 526 root  cwd       DIR  253,3     4096    2 /
jbd2/dm-3 526 root  rtd       DIR  253,3     4096    2 /
jbd2/dm-3 526 root  txt   unknown                      /proc/526/exe


dmraid -r  #man dmraid
/dev/sda: ddf1, ".ddf1_disks", GROUP, ok, 285155328 sectors, data@ 0
/dev/sdb: ddf1, ".ddf1_disks", GROUP, ok, 285155328 sectors, data@ 0


lsblk -f   #RAID1:数据安全性高,即同样的数据在另一块盘上备份一份,硬盘的容量也就减少一半。
NAME                                                               FSTYPE          LABEL UUID                                 MOUNTPOINT
sdb                                                                ddf_raid_member       LSI     \x10                        
└─ddf1_4c5349202020202010000055000000004711471100001450 (dm-0)                                                                
  ├─ddf1_4c5349202020202010000055000000004711471100001450p1 (dm-1) ext4                  bef5de45-511b-41c2-b487-6cf98faf978a /boot
  ├─ddf1_4c5349202020202010000055000000004711471100001450p2 (dm-2) swap                  861a3dbd-ca4b-4c97-b2b8-51504ee45949 [SWAP]
  └─ddf1_4c5349202020202010000055000000004711471100001450p3 (dm-3) ext4                  410be0c5-9b55-490e-b924-606d46182ea2 /
sda                                                                ddf_raid_member       LSI     \x10                        
└─ddf1_4c5349202020202010000055000000004711471100001450 (dm-0)                                                                
  ├─ddf1_4c5349202020202010000055000000004711471100001450p1 (dm-1) ext4                  bef5de45-511b-41c2-b487-6cf98faf978a /boot
  ├─ddf1_4c5349202020202010000055000000004711471100001450p2 (dm-2) swap                  861a3dbd-ca4b-4c97-b2b8-51504ee45949 [SWAP]
  └─ddf1_4c5349202020202010000055000000004711471100001450p3 (dm-3) ext4                  410be0c5-9b55-490e-b924-606d46182ea2 /

dmraid -s
*** Group superset .ddf1_disks
--> Active Subset
name   : ddf1_4c5349202020202010000055000000004711471100001450
size   : 285155328
stride : 128
type   : mirror
status : ok
subsets: 0
devs   : 2
spares : 0


步骤一) top命令显示后 按1
             Cpu2  :  0.0%us,  0.0%sy,  0.0%ni,  0.0%id,100.0%wa,  0.0%hi,  0.0%si,  0.0%st
             wa -- iowait  AmountoftimetheCPUhasbeenwaitingfor I/O to complete.

步骤二)iostat -x 2 5  #定位各个磁盘读写哪个高一些,iostat 会每2秒更新一次,一共打印5次信息, -x 的选项是打印出扩展信息,实际使用得需要扩展信息-x得到svctm一项,反应了磁盘的负载情况,如果该项大于15ms,并且util%接近100%,那就说明,磁盘现在是整个系统性能的瓶颈了。
svctm:          平均每次设备I/O操作的服务时间 (毫秒)。即 delta(use)/delta(rio+wio)
%util:          一秒中有百分之多少的时间用于 I/O 操作,或者说一秒中有多少时间 I/O 队列是非空的。即 delta(use)/s/1000 (因为use的单位为毫秒)
              如果 %util 接近 100%,说明产生的I/O请求太多,I/O系统已经满负荷,该磁盘可能存在瓶颈。
avgqu-sz:     平均I/O队列长度。即 delta(aveq)/s/1000 (因为aveq的单位为毫秒)。

浅显易懂的解释:
平均服务时间(svctm)类似于收银员的收款速度
平均等待时间(await)类似于平均每人的等待时间
I/O 操作率 (%util)类似于收款台前有人排队的时间比例。


实践发现dm-0 / dm-3 卡住了,产生的I/O请求太多,I/O系统已经满负荷,该磁盘可能存在瓶颈,也可能是坏了,
第一个iostat 报告会打印出系统最后一次启动后的统计信息,这也就是说,在多数情况下,第一个打印出来的信息应该被忽略,剩下的报告,都是基于上一次间隔的时间。举例子来说,这个命令会打印5次,第二次的报告是从第一次报告出来一个后的统计信息,第三次是基于第二次 ,依次类推:
iostat -x 2 5  # %util 出现100,设备是挂载的dm-0
Device:         rrqm/s   wrqm/s     r/s     w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await  svctm  %util
dm-0              0.00     0.00    0.00    0.00     0.00     0.00     0.00     2.00    0.00   0.00 100.00


#dm-0的%utilized 是100.00%,这个很好的说明了有进程正在写入到dm-0磁盘中。
dm是device mapper(设备映射)的意思:
dm-0是个块设备,就是个分区,他被挂载在不同的目录,但是不同目录里的文件却不一样。


svctm 一般要小于 await (因为同时等待的请求的等待时间被重复计算了),如果 svctm 比较接近 await,说明 I/O 几乎没有等待时间;如果 await 远大于 svctm,说明 I/O 队列太长,应用得到的响应时间变慢,如果响应时间超过了用户可以容许的范围,这时可以考虑更换更快的磁盘......。



步骤三)查找引起高I/O wait 对应的进程 ,iotop    #查找I/O wait 对应的进程


步骤四)查找哪个文件引起的I/Owait:
lsof 命令可以展示一个进程打开的所有文件,或者打开一个文件的所有进程。从这个列表中,我们可以找到具体是什么文件被写入,根据文件的大小和/proc中io文件的具体数据

我们可以使用-p <pid>的方式来减少输出,pid是具体的进程
lsof -p 1028

步骤四)更深入的确认这些文件被频繁的读写,我们可以通过如下命令来查看

[root@localhost ~]# df /tmp
文件系统               1K-块    已用     可用 已用% 挂载点
/dev/mapper/cl-root 17811456 3981928 13829528   23% /
  从上面的命令结果来看,我们可以确定/tmp 是我们环境的逻辑磁盘的根目录

复制代码
复制代码
[root@localhost ~]# pvdisplay
  --- Physical volume ---
  PV Name               /dev/sda2
  VG Name               cl
  PV Size               19.00 GiB / not usable 3.00 MiB
  Allocatable           yes (but full)
  PE Size               4.00 MiB
  Total PE              4863
  Free PE               0
  Allocated PE          4863
  PV UUID               4QfaOy-DNSO-niK1-ayn2-K6AY-WZMy-9Nd2It
复制代码
复制代码
  过pvdisplay我们能看到/dev/sda2其实就是我们用来创建逻辑磁盘的具体磁盘。通过以上的信息我们可以放心的说lsof的结果就是我们要查找的文件

cat /proc/18987/io
rchar: 58891582418
wchar: 58891579778
syscr: 46556085
syscw: 46556077
read_bytes: 212992
write_bytes: 59580235776
cancelled_write_bytes: 0

同时可以结合vmstat 查看查看b参数(等待资源的进程数),b有一个等待:
vmstat
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
0  1      0 11119256 238876 205460    0    0     0     0    2    3  0  0 99  1  0


来自:https://www.cnblogs.com/happy-king/p/9234122.html
cat test.txt


sh test.txt
. test.txt


run:
sh test.txt
hello world


. test.txt  
hello world

即便test.txt没有可执行权限,也能够正常运行。

想一个自己的printf程序到底执行的是哪一个呢?
type -a printf
printf is a shell builtin
printf is /bin/printf
printf is /usr/bin/printf


更多来自:https://mp.weixin.qq.com/s/LdHHVsK9UsQ1mNLgA1pdSw
分页: 9/339 第一页 上页 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 下页 最后页 [ 显示模式: 摘要 | 列表 ]