You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Apache Guacamole Web客户端RDP远程VM速度慢于微软远程桌面的优化咨询

问题背景与环境配置

架构概述

我正在构建一款可通过RDP连接远程VM的Web客户端,本地MacBook通过Docker运行guacd服务器。前端通过JS脚本经WebSocket连接Java后端,由后端建立与guacd服务器的隧道,这是标准的Guacamole Web客户端流程。

Java后端连接guacd的配置代码

guacConfig.setParameter("ignore-cert", "true");
guacConfig.setParameter("force-lossless", "true");

try {
    GuacamoleSocket socket = new ConfiguredGuacamoleSocket(
        new InetGuacamoleSocket(hostname, port),
        guacConfig
    );
    GuacamoleTunnel tunnel = new SimpleGuacamoleTunnel(socket);
    return tunnel;
} catch (Exception e) {
    System.out.println(e);
    return null;
}

前端JS连接代码(index.html)

<script type="text/javascript"> /* <![CDATA[ */

    // Get display div from document
    var display = document.getElementById("display");

    // Instantiate client, using an HTTP tunnel for communications.
    let guacTunnel = new Guacamole.WebSocketTunnel("websocketendpoint");
    var guac = new Guacamole.Client(
        guacTunnel
    );

    // Add client to display div
    display.appendChild(guac.getDisplay().getElement());
    
    // Error handler
    guac.onerror = function(error) {
        alert(error);
        console.log(error)
    };

    // Connect
    guac.connect();

    // Disconnect on close
    window.onunload = function() {
        console.log("disconnecting");
        guac.disconnect();
    }

    // Mouse
    var mouse = new Guacamole.Mouse(guac.getDisplay().getElement());

    mouse.onEach(['mousedown', 'mouseup', 'mousemove'], function sendMouseEvent(e) {
        guac.sendMouseState(e.state);
    });

    // Keyboard
    var keyboard = new Guacamole.Keyboard(document);

    keyboard.onkeydown = function (keysym) {
        guac.sendKeyEvent(1, keysym);
    };

    keyboard.onkeyup = function (keysym) {
        guac.sendKeyEvent(0, keysym);
    };

/* ]]> */ </script>

远程VM的xrdp配置与启动命令

启动xrdp的命令

sudo apt-get update
sudo apt update
sudo ufw enable
sudo ufw allow ssh
sudo ufw allow 3389/tcp
sudo ufw reload
sudo systemctl stop apparmor
sudo apt install xfce4 xfce4-goodies -y
sudo apt install xrdp -y
sudo adduser xrdp ssl-cert
sudo chmod +x /etc/xrdp/key.pem
sudo reboot

修改的xrdp.ini配置

tcp_send_buffer_bytes=8388608
crypt_=none

网络参数调整

sudo sysctl -w net.core.wmem_max=8388608

关闭桌面合成功能

xfconf-query --channel=xfwm4 --property=/general/use_compositing --type=bool --set=false --create

连接性能问题

使用Web客户端RDP连接VM时速度很慢,但使用Microsoft Remote Desktop连接则十分流畅。

Microsoft Remote Desktop连接时的xrdp日志

connected client computer name: Prabuddhas-Lapt
784]: (5784)(140716040189760)[INFO ] adding channel item name rdpdr chan_id 1004 flags 0x80800000
784]: (5784)(140716040189760)[INFO ] adding channel item name rdpsnd chan_id 1005 flags 0xc0000000
784]: (5784)(140716040189760)[INFO ] adding channel item name cliprdr chan_id 1006 flags 0xc0a00000
784]: (5784)(140716040189760)[INFO ] adding channel item name drdynvc chan_id 1007 flags 0xc0800000
784]: (5784)(140716040189760)[INFO ] TLS connection established from ::ffff:73.70.63.162 port 57150: TLSv1.3 with cipher TLS_AES_256_GCM_SHA384
784]: (5784)(140716040189760)[DEBUG] xrdp_00001698_wm_login_mode_event_00000001
784]: (5784)(140716040189760)[INFO ] Loading keymap file /etc/xrdp/km-00000409.ini
784]: (5784)(140716040189760)[WARN ] local keymap file for 0x00000409 found and doesn't match built in keymap, using local keymap file
784]: (5784)(140716040189760)[DEBUG] xrdp_wm_log_msg: connecting to sesman ip 127.0.0.1 port 3350
784]: (5784)(140716040189760)[INFO ] xrdp_wm_log_msg: sesman connect ok
784]: (5784)(140716040189760)[DEBUG] xrdp_wm_log_msg: sending login info to session manager, please wait...
784]: (5784)(140716040189760)[DEBUG] return value from xrdp_mm_connect 0
784]: (5784)(140716040189760)[INFO ] xrdp_wm_log_msg: login successful for display 10
784]: (5784)(140716040189760)[DEBUG] xrdp_wm_log_msg: started connecting
784]: (5784)(140716040189760)[INFO ] lib_mod_log_peer: xrdp_pid=5784 connected to X11rdp_pid=1918 X11rdp_uid=1000 X11rdp_gid=1000 client_ip=::ff>
784]: (5784)(140716040189760)[DEBUG] xrdp_wm_log_msg: connected ok
784]: (5784)(140716040189760)[DEBUG] xrdp_mm_connect_chansrv: chansrv connect successful
784]: (5784)(140716040189760)[DEBUG] Closed socket 18 (AF_INET6 ::1 port 47132)
784]: (5784)(140716040189760)[DEBUG] Closed socket 12 (AF_INET6 ::ffff:192.168.122.234 port 3389)
784]: (5784)(140716040189760)[DEBUG] xrdp_mm_module_cleanup
784]: (5784)(140716040189760)[DEBUG] Closed socket 19 (AF_UNIX)
784]: (5784)(140716040189760)[DEBUG] Closed socket 20 (AF_UNIX)

Guacamole Web客户端连接时的xrdp日志

connected client computer name: Guacamole RDP
993]: (6993)(140716040189760)[INFO ] adding channel item name cliprdr chan_id 1004 flags 0xc0a00000
993]: (6993)(140716040189760)[INFO ] adding channel item name rdpdr chan_id 1005 flags 0xc0800000
993]: (6993)(140716040189760)[INFO ] adding channel item name rdpsnd chan_id 1006 flags 0xc0000000
993]: (6993)(140716040189760)[INFO ] TLS connection established from ::ffff:73.70.63.162 port 57206: TLSv1.3 with cipher TLS_AES_256_GCM_SHA384
993]: (6993)(140716040189760)[DEBUG] xrdp_00001b51_wm_login_mode_event_00000001
993]: (6993)(140716040189760)[INFO ] Loading keymap file /etc/xrdp/km-00000409.ini
993]: (6993)(140716040189760)[WARN ] local keymap file for 0x00000409 found and doesn't match built in keymap, using local keymap file
993]: (6993)(140716040189760)[DEBUG] xrdp_wm_log_msg: connecting to sesman ip 127.0.0.1 port 3350
993]: (6993)(140716040189760)[INFO ] xrdp_wm_log_msg: sesman connect ok
993]: (6993)(140716040189760)[DEBUG] xrdp_wm_log_msg: sending login info to session manager, please wait...
993]: (6993)(140716040189760)[DEBUG] return value from xrdp_mm_connect 0
993]: (6993)(140716040189760)[INFO ] xrdp_wm_log_msg: login successful for display 10
993]: (6993)(140716040189760)[DEBUG] xrdp_wm_log_msg: started connecting
993]: (6993)(140716040189760)[INFO ] lib_mod_log_peer: xrdp_pid=6993 connected to X11rdp_pid=1918 X11rdp_uid=1000 X11rdp_gid=1000 client_ip=::ff>
993]: (6993)(140716040189760)[DEBUG] xrdp_wm_log_msg: connected ok
993]: (6993)(140716040189760)[DEBUG] xrdp_mm_connect_chansrv: chansrv connect successful
993]: (6993)(140716040189760)[DEBUG] Closed socket 18 (AF_INET6 ::1 port 42942)
993]: (6993)(140716040189760)[DEBUG] Closed socket 12 (AF_INET6 ::ffff:192.168.122.234 port 3389)
993]: (6993)(140716040189760)[DEBUG] xrdp_mm_module_cleanup
993]: (6993)(140716040189760)[DEBUG] Closed socket 19 (AF_UNIX)
993]: (6993)(140716040189760)[DEBUG] Closed socket 20 (AF_UNIX)
疑问与需求
  1. 我发现VNC连接速度反而比RDP快,但听说VNC占用带宽更高,请问二者的带宽对比实际情况如何?
  2. 如何提升我的Web应用的RDP连接速度?有哪些高效的调试方法?

内容的提问来源于stack exchange,提问作者Pierre Bastola

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 08:20:56