在问这个之前我已经做了很多阅读,所以让我先说我没有用完连接,内存或cpu,而且据我所知,我也没有用完文件描述符.
当MySQL负载很重时,这就是PHP抛出的东西:
无法通过套接字'/var/lib/mysql/mysql.sock'连接到本地MySQL服务器(11"资源暂时不可用")
这种情况在负载下随机发生 - 但我推的越多,php就越频繁地向我抛出.在发生这种情况时,我总是可以通过控制台本地连接,从PHP到127.0.0.1,而不是使用更快的unix套接字的"localhost".
这里有一些系统变量来清除常见的问题:
cat /proc/sys/fs/file-max = 4895952
lsof | wc -l = 215778 (during "outages")
Run Code Online (Sandbox Code Playgroud)
可用连接的最高使用率:26%(261/1000)
InnoDB缓冲池/数据大小:10.0G/3.7G(足够的房间)
我实际上在运行MariaDB(服务器版本:10.0.17-MariaDB MariaDB Server)
这些结果是在正常负载下生成的,并且通过在非工作时间运行mysqlslap来生成,因此,慢查询不是问题 - 只是高连接.
有什么建议?如有必要,我可以报告其他设置/数据 - mysqltuner.pl说一切都很好
而且,这里显而易见的事情是通过IP连接工作得很好并且在这些中断期间很快 - 我只是无法弄清楚原因.
编辑:这是我的my.ini(从我最近的故障排除更改中看,有些值似乎有点高,请记住,MySQL日志,系统日志或dmesg中没有错误)
socket=/var/lib/mysql/mysql.sock
skip-external-locking
skip-name-resolve
table_open_cache=8092
thread_cache_size=16
back_log=3000
max_connect_errors=10000
interactive_timeout=3600
wait_timeout=600
max_connections=1000
max_allowed_packet=16M
tmp_table_size=64M
max_heap_table_size=64M
sort_buffer_size=1M
read_buffer_size=1M
read_rnd_buffer_size=8M
join_buffer_size=1M
innodb_log_file_size=256M
innodb_log_buffer_size=8M
innodb_buffer_pool_size=10G
[mysql.server]
user=mysql
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
open-files-limit=65535
Run Code Online (Sandbox Code Playgroud) 使用posix read()write()linux调用,是否保证如果我通过一个文件描述符写入并通过另一个文件描述符读取,则以串行方式使这两个动作相互排斥......我的读文件描述符总是会看到写文件描述符最后写的是什么?
我相信情况确实如此,但我想确定并且手册页对此没有太大帮助
我被告知我的服务器拒绝接受特定端口的客户端网络连接可能是由于缺少文件描述符.我查看了这一切,并在此处阅读:http: //www.netadmintools.com/art295.html
所以我测试了我的系统,我得到了这个:
cat /proc/sys/fs/file-nr
1088 0 331287
Run Code Online (Sandbox Code Playgroud)
这是什么意思?我的限制很高但我有0个可用的文件描述符?为什么?我如何为我的服务器解决这个问题?
即使我关闭了我的服务器,第二列实际上仍然保持在0,甚至在启动后它甚至保持在0!
在/proc/pid/fd/,文件描述符太多.我可以使用shell命令关闭这些文件描述符吗?
HANDLE与Linux中的文件描述符类似吗?据我所知,HANDLE用于处理Windows上的每个资源,例如字体,图标,文件,设备......,它实质上只是指向保存特定资源数据的内存块的void指针
这有点奇怪.我的代码没有输出我认为应该的东西.我在各个阶段添加了一些打印语句,以查看它出错的地方.依然没有.所以我在main的开头添加了一个printf语句.这就是我真的很困惑的地方.
所以我假设文件描述符发生了一些有趣的事情.我改成printf了fprintf.依然没有.打印到stderr fprintf确实有效!为什么会这样?
除了初始打印语句之外,从main中删除所有主体并返回打印.
int main(void) {
fprintf(stdout, "STARTED!");
//Create an Internet domain socket
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
//If this fails exit and print the error
if (sockfd == -1) {
printf("Error %d, cannot create socket", errno);
return 1;
}
printf("SOCKET CREATED!");
//Creates a socket address
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(8080);
addr.sin_addr.s_addr = INADDR_ANY;
//Attempts to bind to the socket address, again prints to error if this fails. …Run Code Online (Sandbox Code Playgroud) 这是在Ubuntu 12.04.3 LTS服务器上.
我已将以下内容添加到/etc/security/limits.conf(我的Golang进程以root身份运行):
* hard nofile 50000
* soft nofile 50000
root hard nofile 50000
root soft nofile 50000
Run Code Online (Sandbox Code Playgroud)
我在/etc/pam.d/common-session中添加了以下内容
session required pam_limits.so
Run Code Online (Sandbox Code Playgroud)
我已将以下内容添加到/etc/sysctl.conf中:
fs.file-max = 50000
Run Code Online (Sandbox Code Playgroud)
然而当我cat/proc/{PID} /限制时,我得到:
Limit Soft Limit Hard Limit Units
Max open files 1024 4096 files
Run Code Online (Sandbox Code Playgroud)
只有当我从Upstart通过sudo initctl start service_name启动进程时才会发生这种情况.如果我自己开始这个过程,它会确认我的设置.
我该如何解决?
如网络编程书籍中所述,select()监视一组文件描述符以供读取.例如,以下是代码的一部分:
select(numfds, &read_fds, NULL, NULL, NULL);
Run Code Online (Sandbox Code Playgroud)
这numfds是read_fds + 1中套接字的最大数量.是否意味着,每个"监视器"循环都会监视select()进程的所有文件描述符,从0到numfds?我的意思是,如果我只有两个文件描述符来监视(0和26),是否选择观察从0到26的所有描述符?
我正在使用以下命令获取管道列表:
lsof | grep PIPE
Run Code Online (Sandbox Code Playgroud)
我想知道FD列的值是什么意思(第5页http://i.imgur.com/KHczptf.png).我认为,r和w平均读取和写入分别,但到底是什么下面的每一个字符,这些装置的数量?
我知道FD意味着文件描述符,我想弄清楚的是列中显示的值是什么意思,比如3r,16w,20r等.