0

我正在使用 libx264 库将视频数据压缩到... x264。

我使用默认值让库根据需要创建尽可能多(少)的线程:

param.i_threads = X264_THREADS_AUTO;

这在我有 64 个处理器(2 个 CPU,每个 CPU 有 16 个内核和英特尔线程)的服务器上效果很好。它实际上将使用大约 5 个线程。

但是,在运行该软件的嵌入式计算机上,我只有 4 个 CPU。它是 Xeon,所以那里没有太多问题,但不知何故它会阻止 USB 端口正常工作。我们正在从那个 USB 端口接收数据,当 4 个 CPU 以大约 100% 的速度使用时,libx264 代码会非常糟糕地接管整个计算机。

我正在考虑两种解决方案,使用 3 作为最大线程数:

param.i_threads = 3;

或者让那些 libx264 线程有一个(很多)更高的 nice 值,这样在该计算机上运行的其他东西就不会被阻塞(即 CPU 更好地共享;其他东西不使用太多 CPU,它通常远低于 10%) .

但是,我无法控制 libx264 库如何创建线程,并且想知道在调用创建线程的 libx264 函数之前更改 nice 值是否对我有用,因此这些线程使用该 nice 值,像这样的东西:

nice(10);
...call libx264 functions...
nice(0);

使这些线程使用+10的好值的意愿?从我在pthread_create()手册页中可以看到,它并没有明确说明线程继承父线程的 nice 值......


注1:我知道这个问题不太可能是USB端口可能正在与视频采集卡争夺DMA......如果是这种情况,我们显然不会通过改变来解决任何问题进程的优先级。我想先试试那个软解决方案。

虽然我可以将 USB 端口移到另一台计算机上,但数据会通过网络传输,这很可能会出现类似的硬件冲突问题。


注意 2:我不想重新编译 libx264 并更改该代码。这超出了我的项目范围。

4

1 回答 1

0

首先,X264 库在您打开句柄时创建线程x264_encoder_open()。这是唯一需要更新 nice 值的函数。

正如 Peter Cordes 在评论中指出的那样,以下仅在您以 root 身份运行时才有效(通常不推荐,即使对于守护进程也是如此):

nice(10);
...call libx264 functions...
nice(0);

这也是错误的,因为nice(0)它只是返回当前的不错值。正确的叫法是nice(-10)

一种解决方案是授予进程权限以成为 root 并且在尝试执行时nice(-10),在之前成为 root 并在之后删除权限。

// change nice(2) to non-preemptive
int inc_nice = 10;
nice(inc_nice);

// create the X264 threads
x264_encoder_open(&params);

// restore the nice value
uid_t user(getuid());
seteuid(0);
nice(-inc_nice);
seteuid(user);

请注意,如果您使用多个线程运行,则此代码是不安全的。返回时seteuid(0),您的其他线程将具有 root 权限。假设您的应用程序是安全的,这应该不是什么大问题,但仍然需要牢记。

要使 systemd 服务有权成为 root,您需要以下内容:

  1. 这假设您正在使用用户和组选项在启动时删除权限。如果您的守护进程以 root 身份运行,那么您甚至不需要特殊处理。你可以打电话nice(-10),它会工作。

    Debian 上的 Web 服务器使用以下内容:

     User=www-data
     Group=www-data
    
  2. 赋予进程特权:

    将 设置NoNewPrivileges为 false (或不包括它,因为这是默认设置):

     NoNewPrivileges=false
    
  3. 为进程提供成为 root 的选项:

    您需要确保进程所有者是 root 并且设置了 's' 标志(又名set user on execution):

     chown root /usr/sbin/my-app
     chmod u+s /usr/sbin/my-app
    

    在大多数情况下,如果您使用 Linux 系统的标准打包程序,则安装在其下的文件/usr/sbin将已经归 root 所有。但是,默认情况下未设置“s”标志。创建 Debian 软件包时,您可以添加debian/rules具有以下内容的文件:

     override_dh_fixperms:
         dh_fixperms
         chmod u+s debian/project-name/usr/sbin/my-app
    

    注意:该rules文件是一个生成文件,因此缩进应该是一个制表符。

于 2021-10-11T19:19:09.657 回答