Цель: при запуске игры FPS в Linux автоматизировать настройку более высокого приоритета для ее сетевого трафика.
Я знаю, что такие задачи обычно выполняются с помощью комбинации iptables (для маркировки IP-пакетов, соответствующих определенным критериям) и tc (для определения приоритета этих IP-пакетов).
Проблемы:
Я стремлюсь к сценарию оболочки-оболочки, который будет:
Это возможно? Я готов пойти дальше и заняться пользовательскими модулями netfilter, если они могут помочь.
Только с iptables это невозможно, но с TC вы можете, iptables по умолчанию - это FIFO «первым пришел - первым ушел», но с помощью TC вы можете установить приоритеты портов, протокола и IPS.
Пример полного натурного решения с QoS
С 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.
Я не думаю, что вы хотите возиться с QoS на клиенте; возможно, на вашем маршрутизаторе, но на клиентской машине вы просто вводите дополнительную обработку пакетов, которая на самом деле замедляет работу. На маршрутизаторе вы устанавливаете приоритет этих пакетов над другими пакетами (например, другие HTTP-соединения или другой трафик, также проходящий через маршрутизатор), так что это победа, но на клиенте вы выполняете дополнительную фильтрацию вместо того, чтобы просто передавать пакеты напрямую. к процессу.
Вы можете использовать nice
тем не менее, чтобы настроить приоритет клиентского процесса, чтобы он получил более быстрый доступ к ЦП, чем фоновые процессы, выполняемые на том же компьютере.
Возможно, вы захотите настроить размер буфера приема / отправки вашей сети, чтобы минимизировать повторные передачи.
Если вы пытаетесь контролировать фактическую пропускную способность вашего компьютера, вам потребуется больше данных о том, что именно трафик FPS и насколько он близок к «другому» трафику, приоритетность которого вы хотите снизить. Возможно, вам удастся уйти с такой простой задачей, как «установить приоритет UDP над TCP», если ваш FPS использует UDP, а весь ваш другой трафик - это TCP. Или может быть сложнее. Если вы знаете, как охарактеризовать каждый набор трафика, вам нужно будет взглянуть на Другой ответы для подробности.