侦听套接字最大连接数提早命中,同时增加了限制
Listening socket max connections hit early, while having increased the limit
我有一个简单的监听套接字,它停止接受套接字,仅在 13 个连接后返回 EN_FILE
。
我尝试以下列方式使用 sysctl:
$ sysctl kern.maxfiles
kern.maxfiles: 12288
$ sysctl kern.maxfilesperproc
kern.maxfilesperproc: 10240
$ sudo sysctl -w kern.maxfiles=1048600
kern.maxfiles: 12288 -> 1048600
$ sudo sysctl -w kern.maxfilesperproc=1048576
kern.maxfilesperproc: 10240 -> 1048576
$ ulimit -S -n
256
$ ulimit -S -n 1048576
$ ulimit -S -n
1048576
但这似乎并不能解决问题,是否需要在 OSX 上专门重新启动?我需要它进行单一测试,所以我不打算在 /etc/sysctl.conf
中永久使用它
套接字创建:
#if os(Linux)
fileDescriptor = Glibc.socket(AF_INET, Int32(SOCK_STREAM.rawValue), 0)
#else
fileDescriptor = Darwin.socket(AF_INET, SOCK_STREAM, 0)
#endif
接受部分:
let result = withUnsafePointer(to: &address) {
[=12=].withMemoryRebound(to: sockaddr.self, capacity: 1) { sockAddress in
// Do nothing
bind(fileDescriptor, sockAddress, UInt32(MemoryLayout<sockaddr_in>.size))
}
}
'
let clientFD = accept(fileDescriptor, nil, nil)
if( clientFD == EMFILE || clientFD == ENFILE ) {
print("[\(type(of: self))] WARNING: Maximum number of open connections has been reached")
close(clientFD)
return nil
}
备注
libtls ( LibreSSL 2.5.5 ) 在 accept() 之后使用。
EN_FILE 是返回值,我个人期望 EM_FILE
您正在将接受的文件描述符与错误代码进行比较。那没有意义。由于文件描述符和错误代码通常都是小整数,当然你最终会得到一个 "match"。
您想将 clientFD
与 -1 进行比较,然后将 errno
与 EMFILE
或 ENFILE
进行比较。
我有一个简单的监听套接字,它停止接受套接字,仅在 13 个连接后返回 EN_FILE
。
我尝试以下列方式使用 sysctl:
$ sysctl kern.maxfiles
kern.maxfiles: 12288
$ sysctl kern.maxfilesperproc
kern.maxfilesperproc: 10240
$ sudo sysctl -w kern.maxfiles=1048600
kern.maxfiles: 12288 -> 1048600
$ sudo sysctl -w kern.maxfilesperproc=1048576
kern.maxfilesperproc: 10240 -> 1048576
$ ulimit -S -n
256
$ ulimit -S -n 1048576
$ ulimit -S -n
1048576
但这似乎并不能解决问题,是否需要在 OSX 上专门重新启动?我需要它进行单一测试,所以我不打算在 /etc/sysctl.conf
中永久使用它套接字创建:
#if os(Linux)
fileDescriptor = Glibc.socket(AF_INET, Int32(SOCK_STREAM.rawValue), 0)
#else
fileDescriptor = Darwin.socket(AF_INET, SOCK_STREAM, 0)
#endif
接受部分:
let result = withUnsafePointer(to: &address) {
[=12=].withMemoryRebound(to: sockaddr.self, capacity: 1) { sockAddress in
// Do nothing
bind(fileDescriptor, sockAddress, UInt32(MemoryLayout<sockaddr_in>.size))
}
}
'
let clientFD = accept(fileDescriptor, nil, nil)
if( clientFD == EMFILE || clientFD == ENFILE ) {
print("[\(type(of: self))] WARNING: Maximum number of open connections has been reached")
close(clientFD)
return nil
}
备注
libtls ( LibreSSL 2.5.5 ) 在 accept() 之后使用。
EN_FILE 是返回值,我个人期望 EM_FILE
您正在将接受的文件描述符与错误代码进行比较。那没有意义。由于文件描述符和错误代码通常都是小整数,当然你最终会得到一个 "match"。
您想将 clientFD
与 -1 进行比较,然后将 errno
与 EMFILE
或 ENFILE
进行比较。