服务器使用
查看某个端口对应的进程
1
| sudo netstat -lnutp | grep port
|
tmux恢复到屏幕大小
有时候我们在某个屏幕下开了一个tmux的session,结果断了连接后再换一个另一个尺寸的屏幕,发现周围一堆白点,能用的窗口大小被限制在上一个屏幕大小,如图:
这时候可以执行:
设置时间
1
2
| sudo rdate -t 60 -s stdtime.gov.hk
sudo hwclock -w
|
文件查找
磁盘挂载
1
2
| fdisk -l
mount /dev/sda /data
|
查看DNS
install zsh without root
1
2
3
4
5
6
| wget -O zsh.tar.xz https://sourceforge.net/projects/zsh/files/latest/download
mkdir zsh && unxz zsh.tar.xz && tar -xvf zsh.tar -C zsh --strip-components 1
cd zsh
./configure --prefix=$HOME
make
make install
|
其他
- 命令行里,
Ctrl+a
可以回到一条命令的开始,Ctrl+e
可以回到结束
ps aux | grep cmd
可以找到cmd对应的进程号,在找到进程号之后,使用ll /proc/进程号
可以看到这个进程的详细信息,比如这个cmd的路径
- 文件(文件夹)按照大小排序:
du -sh * | sort -h
- 文件夹下文件数量:
ls | wc -l
mac中查看文件编码
安装mysqlclient可能遇到问题
尝试:
sudo yum install python3-devel mysql-devel
bash历史信息按前缀提示
虽然我很不喜欢用bash,但是总有一些情况需要用到bash(比如帮其他人debug)。而bash让我最讨厌的是按↑键时会直接上一条,而不是匹配我已经输入的前缀找到相同前缀的历史输入,这时候勉强可以:
1
2
| bind '"\e[A": history-search-backward'
bind '"\e[B": history-search-forward'
|
这样可以实现类似效果
找不到某个.so文件
1
| find / -name your_lib.so
|
找到io瓶颈
https://cloud.tencent.com/developer/article/1718267
这个命令可以看读写速度
这个命令可以持续观测io情况
这个命令可以按照io情况对进程排序
测速
1
2
| pip install speedtest-cli
speedtest-cli
|
Docker
docker info
docker info
这个命令可以帮助我们查看一些docker的配置信息,比如Docker Root Dir
这一行指明了数据的存储路径,根目录所在磁盘比较小的时候就需要修改这一项。
docker配置信息
配置文件在/etc/docker/daemon.json
docker-proxy
之前docker-compose down
之后再将服务重新用docker-compose up
拉起时遇到报错,错误提示是:
ERROR: for d_fr_en3 Cannot start service d_fr_en3: driver failed programming external connectivity on endpoint d_fr_en3 (f4c63e58fe2221ac2b283f76e75ee5d5cc7790d47f78c528167902a097c20e05): Bind for 0.0.0.0:30390 failed: port is already allocated
意思是相应端口被占用了,但是我明明没有占用,通过看占用的进程,发现是docker,然后用docker container ls -all
看一下是一个docker-proxy
在占用,可以通过ps -aux | grep docker-proxy
这条命令找到。这个是docker自带的proxy,那么我们就需要干掉它,可以直接kill掉,但是治标不治本。其实,我们可以直接停用docker-proxy,这需要修改/etc/docker/daemon.json
里的配置信息,需要加上"userland-proxy": false
,例如:
1
2
3
| {
"userland-proxy": false
}
|
nvidia-runtime
忘了是不是需要手动配置,总之配置完之后在/etc/docker/daemon.json
里的样子是:
1
2
3
4
5
6
7
8
| {
"runtimes": {
"nvidia": {
"path": "nvidia-container-runtime",
"runtimeArgs": []
}
}
}
|
设置docker container时间
用docker-compose起容器的时候,时间有可能是utc时间,我们可以通过设置环境变量来改成北京时间,在要设置时间的service底下,加上下面这两行(也就是environment
和image
在同一层级):
1
2
| environment:
TZ: Asia/Shanghai
|
其他
-
p.s. 移除docker-compose里的restart可以减少卡死的概率
- docker run的时候加上
-u 0
可以以root运行
- 找到一个container对应的路径:
docker inspect 1d97b7523bb9
- 进入一个container的bash:
docker exec -it 35378c61a875 bash
- 可以通过删掉不用的镜像来释放空间:
docker system prune
GPU
批量kill进程
举个例子,有的时候我们并行训练fairseq,ctrl+c后还有残余的进程,这时候我们想批量杀死
1
| nvidia-smi | grep your_feature | awk '{print $5}' | xargs kill
|
-
nvidia-smi
:获取各个显卡上的信息
-
grep your_feature
:这里的your_feature其实是视情况而定的,比如我要是发现我要kill的进程都是某个环境里的,而nvidia-smi恰好有这个环境名字,我就可以grep这个环境的名字。例如,下面这张图里都含有triton,那么我就可以grep triton
(当然这个例子不够恰当,因为他们的pid都一样可以直接干掉pid,我说的是训练的时候有可能pid是不一样的,比如pytorch的并行就不是一样的)
-
awk '{print $5}'
:获取上述结果的第五列
-
xargs kill
:从上面的pid来进行kill,这里的xargs命令用将上一步的每一个pid传递给kill命令,在管道命令中很常见
-
root用户启动nvidia-persistenced,可以保持不挂
- 有的时候在A100上跑【并行】训练会卡住,可以尝试增加这个环境变量:
export NCCL_P2P_DISABLE=1
;另外还可以尝试将Dataloader的worker数量设置成1
- Triton提示
Failed to allocate memory for requested buffer of size
大概率是显存炸了,比如传入的最大batch太大,可以尝试测一下大batch会不会稳定复现
数据库 (MySQL)
创建用户并给予权限
1
2
| CREATE USER your_user_name IDENTIFIED BY 'your_password' with MAX_USER_CONNECTIONS 5;
grant select,insert,update,create,index on your_database.* to 'your_user_name';
|
修改最大连接数
1
2
| UPDATE mysql.user SET max_user_connections = 20 WHERE user='your_user_name';
FLUSH PRIVILEGES;
|
检查用户权限
1
| SHOW GRANTS for your_user_name
|
移除用户权限
1
| REVOKE update ON your_db_name.your_table_name FROM your_user_name;
|
Redis Client
中文
在使用redis-cli连接redis时,加上--raw
可以显示中文
对比一下,加之前是
1
| "\xe4\xb8\x89\xe4\xbd\x93\xe7\x94\xb5\xe8\xa7\x86\xe5\x89\xa7\xe8\xbf\x91\xe6\x9c\x9f\xe4\xb8\x8a\xe6\x98\xa0\xe4\xba\x86\xef\xbc\x8c\xe5\xa5\xbd\xe8\xaf\x84\xe5\xa6\x82\xe6\xbd\xae\xe5\x95\x8a"
|
加之后是
常用的命令
select dbnum
randomkey
dbsize
get your_key
del your_key
flushdb
:删除当前db里所有key