【Wine游戏助手文档】如何为Esync增大系统文件描述符上限

@Ta 2022-05-01发布,2022-05-02修改 3491点击

什么是Esync?

Esync 的全称是 eventfd-based synchronization(基于事件通知文件描述符的同步),它减小了EXE程序与Wine内核服务进程(wineserver)通信时的开销,提升了多核游戏的性能。

在Wine中,wineserver进程用于取代Windows的内核服务,它提供一系列和EXE运行息息相关的功能:

  • 消息路由
  • 注册表管理
  • 调试接口
  • 同步原语
  • 窗口管理
  • 线程跟踪

等等。所以EXE会频繁的和wineserver通信,减小通信开销就可以提升EXE的运行性能。

目前有两种减小通信开销的方法:

  1. Esync:基于事件通知文件描述符的同步(eventfd-based synchronization)
  2. Fsync:基于快速用户区互斥锁的同步(fast userspace mutex based synchronization / futex-based synchronization)

第二种比第一种快,但是要求Linux内核版本 >= 5.16(deepin 的 5.15 内核似乎也可以用)。如果内核不支持 Fsync,默认会使用 Esync。

什么是文件描述符上限

文件描述符相当于Windows中的“句柄”,记录了程序运行时动态分配的资源。为了防止程序占用大量资源不释放,导致系统卡死,系统对程序允许打开的句柄数进行了限制,这就是“文件描述符上限”。

Esync的每次同步都需要占用一个文件描述符(句柄),所以同一时间可能打开成千上万个文件描述符,可能会超过某些系统的默认上限。虽然如此,但现代计算机并不会因为打开几万个句柄就变卡,所以纯粹是这些系统给的上限太小了。

如果Esync打开的文件描述符已经超过上限,同步就会失败,Wine程序就会卡住,或者崩溃。所以,必须把上限提升到Wine永远用不完的程度才行。

如何检查 Esync 兼容性

使用 Systemd 240 和更新版本的系统已经与 Esync 兼容。

如果您不确定您的系统是否兼容,请运行 ulimit -Hn 命令,如果打印的值大于或等于 524288,那么您的系统与 Esync 兼容。

图片.png

如何使您的系统与 Esync 兼容

如果您的系统与 Esync 不兼容(ulimit -Hn 打印的值低于 524288 ,例如为 4096),您有两种不同的方法来解决此问题。哪种方法可用取决于当前使用的发行版。应用这两种方法应该都没有副作用。

  1. 修改 Systemd 配置

    此方法适用于 Ubuntu 和其他使用 systemd 的系统。您需要编辑/etc/systemd/system.conf/etc/systemd/user.conf文件(需要root权限/sudo),向其中添加一行DefaultLimitNOFILE=524288。如果DefaultLimitNOFILE=已经存在,请把值改为524288并删除开头的#号以使其生效(以#开头的行是注释,不生效)。

    编辑文件后,重启计算机以使更改生效。要验证是否生效,请运行 ulimit -Hn,如果结果变成524288就生效了。

    如果打印的值仍然较小,请尝试下面的 ulimits 方法。

  2. 修改 ulimits.conf

    在不使用 Systemd 的 Linux 发行版或使用 pam-limits.conf 的发行版(Arch Linux、Fedora、Solus...)上,您需要编辑/etc/security/limits.conf,新增一行:

    用户名 hard nofile 524288
    

    用户名替换为您的实际用户名。保存文件后,重启电脑以使更改生效,然后运行 ulimit -Hn 进行验证。

与 Esync 兼容的 Wine 版本

Lutris 从 0.5.9 开始默认启用 Esync,所有当前可用的 lutris 系列 Wine(版本开头是lutris-的wine)都支持 Esync。

此外,proton系列、tkg系列和winehq-staging系列也支持Esync,但是winehq-devel等其他系列则不支持。

回复列表(0|隐藏机器人聊天)
帖子没有回复
添加新回复
回复需要登录