setsockopt EOPNOTSUPP(不支持操作)

setsockopt EOPNOTSUPP(不支持操作)

当我strace运行 MySQL 进程时,我不断发现相同的错误:

setsockopt(240, SOL_IP, IP_TOS, [8], 4) = -1 EOPNOTSUPP (Operation not supported)
futex(0x87ab944, FUTEX_WAKE_OP_PRIVATE, 1, 1, 0x87ab940, {FUTEX_OP_SET, 0,         FUTEX_OP_CMP_GT, 1}) = 1
futex(0x87ab260, FUTEX_WAKE_PRIVATE, 1) = 1
select(13, [10 12], NULL, NULL, NULL)   = 1 (in [12])
fcntl64(12, F_SETFL, O_RDWR|O_NONBLOCK) = 0
accept(12, {sa_family=AF_FILE, path="\246\32629iE"...}, [2]) = 803
fcntl64(12, F_SETFL, O_RDWR)            = 0
getsockname(803, {sa_family=AF_FILE, path="/var/lib/mysql\1"...}, [28]) = 0
fcntl64(803, F_SETFL, O_RDONLY)         = 0
fcntl64(803, F_GETFL)                   = 0x2 (flags O_RDWR)
fcntl64(803, F_SETFL, O_RDWR|O_NONBLOCK) = 0
setsockopt(803, SOL_IP, IP_TOS, [8], 4) = -1 EOPNOTSUPP (Operation not supported)
futex(0x87ab944, FUTEX_WAKE_OP_PRIVATE, 1, 1, 0x87ab940, {FUTEX_OP_SET, 0,     FUTEX_OP_CMP_GT, 1}) = 1
futex(0x87ab260, FUTEX_WAKE_PRIVATE, 1) = 1
select(13, [10 12], NULL, NULL, NULL)   = 1 (in [12])
fcntl64(12, F_SETFL, O_RDWR|O_NONBLOCK) = 0
accept(12, {sa_family=AF_FILE, path="\246\32629iE"...}, [2]) = 240
fcntl64(12, F_SETFL, O_RDWR)            = 0
getsockname(240, {sa_family=AF_FILE, path="/var/lib/mysql\1"...}, [28]) = 0
fcntl64(240, F_SETFL, O_RDONLY)         = 0
fcntl64(240, F_GETFL)                   = 0x2 (flags O_RDWR)
fcntl64(240, F_SETFL, O_RDWR|O_NONBLOCK) = 0
setsockopt(240, SOL_IP, IP_TOS, [8], 4) = -1 EOPNOTSUPP (Operation not supported)

当我查看正在运行的 mysql 进程时,没有看到任何异常。

我猜想这可能是我的代码中的某个地方,所以我修改了 .htaccess,使其发出 502 错误,以防止它加载任何内容。错误仍然会出现,只是出现的频率降低了。

有不少帖子说讨论这个错误,但没有关于如何解决它的真正答案。

my.conf,根据要求:

[mysqld]
#skip-networking
#log-slow-queries
#safe-show-database
#local-infile = 0

log-slow-queries = /var/log/mysql-slow.log
max_connections = 200
query_cache_limit = 128643200
key_buffer_size = 1200144000
low_priority_updates = 1
concurrent_insert = 2
thread_cache_size = 7
query_cache_size = 662144000
table_cache = 1600
table_definition_cache = 1024
long_query_time = 2.5
open_files_limit = 2647
max_connect_errors=999999999

答案1

我最初以为你发布这个是因为它会造成彻底失败。现在我明白这不是失败,我将解释为什么这样做没问题。

正如 David 所说,IP_TOS 是用于设置服务质量规定的服务类型的调用。本地连接(my.cnf 显示您必须使用该连接)不支持该功能。

在用 C 语言编写代码时,系统调用几乎总是在成功时返回 0 或其他数字,通常映射到常量。收到这样的错误代码并不意味着发生了故障。例如,我可以通过调用文件来快速检查文件stat,如果文件存在,我会得到某些结果。如果文件不存在或目录权限不允许我查看列表,我会得到错误代码。这并不意味着我的应用程序失败了。我是否希望该文件存在取决于我对代码的理解。

同样,MySQL 本质上不会因为捕获到代码而失败。它不会经历检查各种事物的过程,它只是设置 TOS 并忘记它。MySQL 并不关心这是否不起作用,甚至可能没有捕获标志。执行分支来检查我们是否可以或检查它是否有效是不值得的。

因此,由于它不是终端,也不是在使事情正常运行的过程中重试几次的结果,所以它不是任何问题的一部分。

我暗示你的问题根本没有返回任何结果,你希望诊断 MySQL 中的一些错误。当你发布问题时,你应该解释哪里出了问题。当你执行调试步骤却没有说明原因时,我假设你展示的就是问题出在哪里。看来你无中生有地犯了一个错误。我建议你提出一个新问题,告诉我们你为什么来这里,以及你试图解决的实际问题是什么,而不是你集中精力解决的明显症状。

答案2

这些都是正常的连接接受行为。没有任何迹象表明存在问题。如果仔细观察,您会看到服务器调用select以找出要做什么,发现可以建立的连接accept并执行此操作。

对于它接受的每个连接,它都会经历一个配置过程,包括将连接设置为非阻塞。它尝试执行的操作之一是设置 QoS 参数。由于此协议不支持 QoS(它们都是本地连接),因此此操作失败。因此它继续执行其他操作。

如果您遇到了某种问题,您的问题根本无法说明问题是什么。

相关内容