环境
Linux服务器:centos5
jenkins:2.5
场景
今天jenkins
无缘无故连接不上gitlab
啦,百思不得奇解,因为我ssh
配置没有问题。
无奈之下,只好重启,结果呢,就在出了问题:
Starting Jenkins daemon --user jenkins --pidfile /var/run/jenkins.pid /usr/java/jdk1.7.0_51/bin/java -Djava.awt.headless=true -DJENKINS_HOME=/home/jenkins/dataspace -jar /usr/lib/jenkins/jenkins.war --logfile=/var/log/jenkins/jenkins.log --webroot=/var/cache/jenkins/war --daemon --httpPort=7080 --ajp13Port=-1 --debug=5 --handlerCountMax=100 --handlerCountMaxIdle=20
Exception in thread "main" java.io.IOException: No space left on device(设备上没有空间)
上面就是报的错误信息。
分析
上面的主要信息就是说设备上没有空间
,也就是说磁盘满了。
查看磁盘命令:df -hT
上面可以看出,avail
为4.3M
。这已经很小了,并且Use%
占用100%
,表示这个区的磁盘空间已经满了。
之后我接着去jenkins
目录中查看,默认情况下,jenkins
的jobs
是在/var/lib/jenkins
里面,由于这个目录空间很小,所以我换到home
下,原则上,不应该出现这个所谓空间不够的情况,不过可以看出是内存被占用的所剩无几。
既然构建记录并没有占用很大空间,那么就对jenkins
大目录查看大小:
这里我说明下
①workspace,这个目录我是用来存放项目代码(包括jar包)的,也就是jenkins拉的代码都在这里
②dataspace,这个目录是存放jenkins构建记录,日志,配置信息
之后我进入workspace
目录再进行分析,到底哪个目录文件很大:
这我就惊讶啦,为什么一个项目会占用2个多G(我知道这个项目并没有这么大),
这种项目为什么占空间的就是lib
目录了,毕竟里面全是jar包
。我用计数器大致加了下,所有的目录加起来也没有2个G
啊!所有呢,我就把大小2G
以上的全部删除。
(因为jenkins重新构建的时候,会再次生成,所以没关系)
删除后,我接着重启,还是不行,依然报没有空间的错误。
已经网上查阅资料后,这段话是查看是网上的:
在Linux中,当我们使用rm在linux上删除了大文件,但是如果有进程打开了这个大文件,却没有关闭这个文件的句柄,那么linux内核还是不会释放这个文件的磁盘空间,最后造成磁盘空间占用100%,整个系统无法正常运行。这种情况下,通过df和du命令查找的磁盘空间,两者是无法匹配的,可能df显示磁盘100%,而du查找目录的磁盘容量占用却很小。
接着我们查看jenkins
占用的进程是否还有残留:
命令:
lsof -n | grep jenkins
结果显示:
我图片上的文字是:
满满的一个屏幕都显示不完,说明jenkins咱执行脚本时,包括定时任务;其开了很多进程,并且这些进程在关闭jenkins服务后,并没有自动关闭,这就导致其占用了很多资源。
接着关闭进程:
kill 14241 30485
之后再次重启jenkins
就好了。
但是我发现,使用df -hT
,查看时,还是Use% 100%
Filesystem Type Size Used Avail Use% Mounted on
/dev/mapper/vg_centos01-lv_root
ext4 20G 19G 21M 100% /
tmpfs tmpfs 32G 0 32G 0% /dev/shm
/dev/sda1 ext4 485M 121M 339M 27% /boot
/dev/mapper/vg_centos01-lv_home
ext4 985G 175G 760G 19% /home
/dev/sdb1 ext4 3.3T 202G 2.9T 7% /mongo
//192.168.0.138/files
cifs 453G 280G 173G 62% /file
//192.168.0.138/file cifs 453G 280G 173G 62% /file
唯一的变化就是Avail
变成了21M
。
———————2017年8月2号————–修改——
询问公司里的高手后,才看懂了上图具体意思,当然也就是个基本的,
上面中的挂载点/
目录Use%
使用率是100%
,总磁盘空间是20G
,已经用了19G
。
虽然/
目录下也有home
、mongo
、file
目录,但是它们已经作为了单独的分区进行挂载,所以无论它们有多大都不会占用/
目录下的空间。所以在清除/
目录时,需要排除掉那些目录。这个时候你可以考虑/var
、/opt
和/usr
目录。(最后,解决是清除了/usr/lib/hadoop-2.5.2/logs
,这个日志占用5.6G,而且已经没人用啦)。
出现这个问题根本原因其实/
目录空间当初设置的太小。而Jenkins
虽然主目录已经换到/home
中,但是默认的日志还是在/var
中,所以它还是要往/
目录中写数据。我也尝试过更改日志路径,但是不生效。
总结
问题虽然解决了,但是Use% 100%
这一块依然不是很了解。
这么低的可用空间,感觉用不了多久,还会报空间不够问题。
当jenkins
空间不够时,未必会直接告诉你是空间不足,比如这次是提示gitlab
连接不上(其实是空间不足啦)。
———————2017年8月2号————–修改——
解决这种问题(设备空间不足的问题)的步骤就是:
①df -hT
查看是哪个分区不足了,比如我的是/
。
②排除掉其他分区目录后,去删除无用的大文件(比如日志)。
③最好的解决办法其实扩容(我公司因为不想重启服务器,所以没有进行扩容)。