从网上看到的两个锁定,都是util-linux包里的。
一个是flock。我从字面上猜测是文件描述符锁~~help显示如下:
flock (util-linux 2.13-pre7)
Usage: flock [-sxun][-w #] fd#
flock [-sxon][-w #] file [-c] command...
-s --shared Get a shared lock
-x --exclusive Get an exclusive lock
-u --unlock Remove a lock
-n --nonblock Fail rather than wait
-w --timeout Wait for a limited amount of time
-o --close Close file descriptor before running command
-c --command Run a single command string through the shell
-h --help Display this text
-V --version Display version
比如在rsync定时同步某文件夹的时候,可能担心上一次任务还没执行完,下一次就开始了。于是可以采用如下方式:
1 * * * * flock -xn /var/run/rsync.lock -c 'rsync -avlR /data/files 172.16.xxx.xxx:/data'
对照usage,x创建一个独享锁,n是如果已存在就退出(这点扶凯说是就等待,但我觉得从help来看是退出,然后等下一分钟重新探测),然后一个lock文件,c是shell命令,具体内容就是rsync。 另一个是taskset,同样字面来看,任务设定锁。help如下:
taskset (util-linux 2.13-pre7)
usage: taskset [options] [mask | cpu-list] [pid | cmd [args...]]
set or get the affinity of a process
-p, --pid operate on existing given pid
-c, --cpu-list display and specify cpus in list format
-h, --help display this help
-v, --version output version information</p>
The default behavior is to run a new command:
taskset 03 sshd -b 1024
You can retrieve the mask of an existing task:
taskset -p 700
Or set it:
taskset -p 03 700
List format uses a comma-separated list instead of a mask:
taskset -pc 0,3,7-11 700
Ranges in list format can take a stride argument:
e.g. 0-31:2 is equivalent to mask 0x55555555
用这个命令,可以把不同的进程,锁定在不同的CPU上完成。这个做法,之前在nginx优化上曾经碰到过,不过那是nginx自带的功能。
在CU上看到有人提起squid与CPU,squid是只支持单CPU的,不过可以通过在不同端口开启多squid进程的办法来完成对多CPU的利用,一般情况下,各squid进程会自动分配在不同CPU上跑,不过这个是系统的资源分配,难保出问题,就可以用这个命令完成锁定了。