![Linux 中 FPS 游戏的更高流量优先级](https://linux22.com/image/523516/Linux%20%E4%B8%AD%20FPS%20%E6%B8%B8%E6%88%8F%E7%9A%84%E6%9B%B4%E9%AB%98%E6%B5%81%E9%87%8F%E4%BC%98%E5%85%88%E7%BA%A7.png)
目标:在 Linux 中运行 FPS 游戏时,自动为其网络流量设置更高的优先级
我知道这样的任务通常是通过 iptables(标记符合特定标准的 IP 数据包)和 tc(对这些 IP 数据包进行优先排序)的组合来完成的。
问题:
- 早期版本的 iptables 有一个 --pid-owner 选项,手册页中有一个警告,称该选项在 SMP 内核上会损坏。我最近版本的 iptables (1.4.7) 在手册页中根本没有提到此选项
- 可能我不能使用单个目标端口来匹配流量,因为游戏服务器在不同的端口上运行
我的目标是编写一个包装器 shell 脚本,它可以:
- 运行游戏可执行文件
- 找到它的名称/pid
- 在此基础上将提高此进程的网络流量优先级
- 当我退出游戏时,会将所有内容恢复为默认设置
这可能吗?如果有任何可以提供帮助的东西,我愿意尝试处理自定义 netfilter 模块。
答案1
我认为您不想在客户端上干扰 QoS;在您的路由器上也许可以,但在客户端机器上,您只是引入了额外的数据包处理,这实际上会减慢速度。在路由器上,您将这些数据包的优先级置于其他数据包之上(例如其他 http 连接或其他也通过路由器的流量),因此这是有利的,但在客户端上,您正在进行额外的过滤,而不是直接将数据包交给进程。
您可能需要使用它nice
来调整客户端进程优先级,以便它比在同一台机器上运行的后台进程更快地访问 CPU。
您可能需要调整网络接收/发送缓冲区大小以帮助最大限度地减少重传。
如果你想控制你的计算机产生的实际带宽,那么你需要更多关于什么的数据确切地FPS 流量是什么,以及它与您想要降低优先级的“其他”流量的接近程度。如果您的 FPS 使用 UDP,而其他流量都是 TCP,那么您可能能够使用“优先考虑 UDP 而不是 TCP”这样简单的方法。或者它可能更复杂。一旦您知道如何描述每组流量,那么您将需要查看其他 答案为了细节。
答案2
仅使用 iptables 是不可能的,但使用 TC 可以,默认的 iptables 是 FIFO“先进先出”,但使用 TC 您可以对端口、协议、ips 进行优先排序。
使用 iptables netfilter 您仍然可以使用 ipt_owner 模块:
-m owner –uid-owner replace_with_user
owner
This module attempts to match various characteristics of the packet
creator, for locally generated packets. This match is only valid in the
OUTPUT and POSTROUTING chains. Forwarded packets do not have any socket
associated with them. Packets from kernel threads do have a socket, but
usually no owner.
[!] --uid-owner username
[!] --uid-owner userid[-userid]
Matches if the packet socket's file structure (if it has one) is
owned by the given user. You may also specify a numerical UID,
or an UID range.
[!] --gid-owner groupname
[!] --gid-owner groupid[-groupid]
Matches if the packet socket's file structure is owned by the
given group. You may also specify a numerical GID, or a GID
range.
[!] --socket-exists
Matches if the packet is associated with a socket.
[!] -m or --match / -p or --protocol
iptables can use extended packet matching modules. These are loaded
in two ways: implicitly, when -p or --protocol is specified, or with
the -m or --match options, followed by the matching module name;
after these, various extra command line options become available,
depending on the specific module.
如果数据包来自您网络内的任何计算机,它都不会工作,但如果应用程序在防火墙服务器内运行,它就会工作,否则您最好匹配 MAC。