1. 程式人生 > >java.io.FileNotFoundException (Too many open files)

java.io.FileNotFoundException (Too many open files)

今天kafka叢集報錯,檢視日誌提示

[2018-07-18 17:34:02,672] ERROR Error while rolling log segment for PREPROCESS in dir /mnt/sdc (kafka.server.LogDirFailureChannel)
java.io.FileNotFoundException: /mnt/sdc/PREPROCESS/00000000000000000000.index (Too many open files)
    at java.io.RandomAccessFile.open(Native Method)
    at java.io.RandomAccessFile.<init>(RandomAccessFile.java:243)
    at kafka.log.AbstractIndex$$anonfun$resize$1.apply(AbstractIndex.scala:105)
    at kafka.log.AbstractIndex$$anonfun$resize$1.apply(AbstractIndex.scala:104)
    at kafka.utils.CoreUtils$.inLock(CoreUtils.scala:217)
    at kafka.log.AbstractIndex.resize(AbstractIndex.scala:104)
    at kafka.log.AbstractIndex$$anonfun$trimToValidSize$1.apply$mcV$sp(AbstractIndex.scala:163)
    at kafka.log.AbstractIndex$$anonfun$trimToValidSize$1.apply(AbstractIndex.scala:163)
    at kafka.log.AbstractIndex$$anonfun$trimToValidSize$1.apply(AbstractIndex.scala:163)
    at kafka.utils.CoreUtils$.inLock(CoreUtils.scala:217)
    at kafka.log.AbstractIndex.trimToValidSize(AbstractIndex.scala:162)
    at kafka.log.Log$$anonfun$roll$2$$anonfun$apply$25.apply(Log.scala:1314)
    at kafka.log.Log$$anonfun$roll$2$$anonfun$apply$25.apply(Log.scala:1311)
    at scala.Option.foreach(Option.scala:257)
    at kafka.log.Log$$anonfun$roll$2.apply(Log.scala:1311)
    at kafka.log.Log$$anonfun$roll$2.apply(Log.scala:1297)
    at kafka.log.Log.maybeHandleIOException(Log.scala:1669)
    at kafka.log.Log.roll(Log.scala:1297)
    at kafka.log.Log.kafka$log$Log$$maybeRoll(Log.scala:1284)
    at kafka.log.Log$$anonfun$append$2.apply(Log.scala:710)
    at kafka.log.Log$$anonfun$append$2.apply(Log.scala:624)
    at kafka.log.Log.maybeHandleIOException(Log.scala:1669)
    at kafka.log.Log.append(Log.scala:624)
    at kafka.log.Log.appendAsLeader(Log.scala:597)
    at kafka.cluster.Partition$$anonfun$13.apply(Partition.scala:499)
    at kafka.cluster.Partition$$anonfun$13.apply(Partition.scala:487)
    at kafka.utils.CoreUtils$.inLock(CoreUtils.scala:217)
    at kafka.utils.CoreUtils$.inReadLock(CoreUtils.scala:223)
    at kafka.cluster.Partition.appendRecordsToLeader(Partition.scala:486)
    at kafka.server.ReplicaManager$$anonfun$appendToLocalLog$2.apply(ReplicaManager.scala:724)
    at kafka.server.ReplicaManager$$anonfun$appendToLocalLog$2.apply(ReplicaManager.scala:708)
    at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:234)
    at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:234)
    at scala.collection.mutable.HashMap$$anonfun$foreach$1.apply(HashMap.scala:130)
    at scala.collection.mutable.HashMap$$anonfun$foreach$1.apply(HashMap.scala:130)
    at scala.collection.mutable.HashTable$class.foreachEntry(HashTable.scala:236)
    at scala.collection.mutable.HashMap.foreachEntry(HashMap.scala:40)
    at scala.collection.mutable.HashMap.foreach(HashMap.scala:130)
    at scala.collection.TraversableLike$class.map(TraversableLike.scala:234)
    at scala.collection.AbstractTraversable.map(Traversable.scala:104)
    at kafka.server.ReplicaManager.appendToLocalLog(ReplicaManager.scala:708)
    at kafka.server.ReplicaManager.appendRecords(ReplicaManager.scala:458)
    at kafka.server.KafkaApis.handleProduceRequest(KafkaApis.scala:458)
    at kafka.server.KafkaApis.handle(KafkaApis.scala:98)
    at kafka.server.KafkaRequestHandler.run(KafkaRequestHandler.scala:65)
    at java.lang.Thread.run(Thread.java:745)
解決辦法:

清晰可見linux檔案操作控制代碼數量的顯示,造成打不開寫日誌檔案。通過ulimit -n命令可以檢視linux系統裡開啟檔案描述符的最大值,一般預設值是1024,對伺服器來說,這個值偏小。

可以使用命令ulimit -n檢視當前系統操作控制代碼數量的省缺值。預設1024

臨時修改:重啟無效ulimit -n 65535

永久修改:開啟vim /etc/security/limits.conf檔案,最下邊增加兩項

* soft nofile 65535 

* hard nofile 65535

前面的*星號代表全域性,針對所有的使用者;nofile代表檔案控制代碼數量

shutdown -r now重啟系統