检查Linuxfunction来设置线程优先级
我有一个使用pthread_setschedparam()
来设置线程优先级的C ++应用程序。 在docker集装箱内,EPERM会失败。
如何检测我的进程是否具有设置线程优先级的必要function?
在pthread_setschedparam()
的人说:
有关更改线程调度策略和优先级所需的权限以及每个调度策略中允许的优先级范围的详细信息的说明,请参见sched(7)。
除了其他的事情之外,
线程必须有特权(CAP_SYS_NICE)才能设置或修改SCHED_DEADLINE策略
欲了解更多信息,你可以看http://man7.org/linux/man-pages/man7/sched.7.html
正确的方法来检查只是试试看,如果你得到EPERM
错误。 首先,LSM可以在允许的调度程序更改上设置任意规则。
所以正确的做法可能只是在发生这种情况时logging警告(一次!)。
我想你的C ++应用程序可以设置线程的优先级,因为在主机上它具有所需的linux能力cap_sys_nice
主机上的所有linuxfunction都可以使用这个命令capsh --print
来计算出来
在docker conatiner里面,你需要使用--cap-add
选项来设置这个function。
docker run -it --rm --cap-add SYS_NICE ubuntu bash
如果它没有工作尝试这一点
docker run -it --rm --userns host --cap-add SYS_NICE ubuntu bash
由于可能有一些问题没有--userns
选项在这里提到https://github.com/moby/moby/issues/25622
最糟糕的情况是:如果没有这样做,然后尝试使用--privileged
选项运行容器,这将所有的Linuxfunction添加到这个容器,虽然不build议。
试一试。
- Docker中的GDB问题
- 基于环境的连接string与ASP NET CORE和Docker支持
- 不能添加Docker支持Visual Studio 2017
- 在使用时,pthreads进程共享内存:docker run –ipc –pid
- 远程debugging.NET核心Linux Docker容器 – “当前源与内置到.dll中的版本不同”
- Redis Docker – 无法从C#客户端连接
- Docker中运行的Dotnet核心Web API在使用外部WCF服务时无法进行身份validation
- 当在.net-core中执行docker化的新进程时,在linux上没有指定输出文件的Ffmpeg错误
- 如何使用Docker容器来设置ASP.NET Web应用程序