【问题标题】:Cassandra start error with ThreadPriorityPolicy=42Cassandra 启动错误,ThreadPriorityPolicy=42
【发布时间】:2018-07-28 09:28:13
【问题描述】:

当我尝试启动 Cassandra 时,它向我显示了这样的错误,我已经在 env.sh 中的 conf 文件中进行了更改,该文件也是如此。

没有类似类型错误的选项适用于此。

intx ThreadPriorityPolicy=42 is outside the allowed range [ 0 ... 1 ]
Improperly specified VM option 'ThreadPriorityPolicy=42'
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.

其他信息

java version "9.0.4"
Java(TM) SE Runtime Environment (build 9.0.4+11)
Java HotSpot(TM) 64-Bit Server VM (build 9.0.4+11, mixed mode)

【问题讨论】:

    标签: java multithreading cassandra jvm


    【解决方案1】:

    正如异常消息已经告诉你的那样,ThreadPriorityPolicy 必须介于 0 和 1 之间:

    intx ThreadPriorityPolicy=42 超出允许范围 [0 ... 1]

    你用过门控吗?这可能会对您有所帮助:https://github.com/gatling/gatling/issues/2950(问题自 Gatling 2.2 起已解决)。

    在您的操作系统上检查此设置是否有意义可能也是值得的。这个设置的意思有点像这样:

    0:正常。 VM 选择适合普通应用程序的优先级。在 Solaris 上,NORM_PRIORITY 及更高版本被映射到正常的本机优先级。 “低于 NORM_PRIORITY”的 Java 优先级映射到较低的本机优先级值。在 Windows 应用程序上,允许使用较高的本机优先级。但是,当 ThreadPriorityPolicy=0 时,VM 将不会使用“最高可能的”本机优先级 THREAD_PRIORITY_TIME_CRITICAL,因为它可能会干扰系统线程。在 Linux 上,线程优先级被忽略,因为操作系统不支持唯一的 SCHED_OTHER 调度类中的静态优先级非根、非实时应用程序的选择。 1:攻击性。 Java 线程优先级映射到整个本地线程优先级范围。较高的 Java 线程优先级映射到较高的本机线程优先级。应谨慎使用此策略,因为有时它会导致应用程序和/或整个系统的性能下降。在 Linux 上,此策略需要 root 权限。

    【讨论】:

      【解决方案2】:

      这是 Cassandra 的一个已知问题 - CASSANDRA-13107

      在 Java 9 之前,JVM 接受 ThreadPriorityPolicy 的任何整数值,而 0 和 1 是唯一有效的值。

      ThreadPriorityPolicy=1 允许提高线程优先级,但前提是进程以root 权限启动。当ThreadPriorityPolicy=1,JVM显式checks即euid=0:

      static int prio_init() {
        if (ThreadPriorityPolicy == 1) {
          // Only root can raise thread priority. Don't allow ThreadPriorityPolicy=1
          // if effective uid is not root. Perhaps, a more elegant way of doing
          // this is to test CAP_SYS_NICE capability, but that will require libcap.so
          if (geteuid() != 0) {
            if (!FLAG_IS_DEFAULT(ThreadPriorityPolicy)) {
              warning("-XX:ThreadPriorityPolicy requires root privilege on Linux");
            }
            ThreadPriorityPolicy = 0;
          }
        }
      

      注意上述代码中的一个错误(或后门):如果您将ThreadPriorityPolicy 设置为0 或1 以外的值,euid 检查将被跳过,但仍允许应用程序使用高于正常的优先级。 Cassandra 使用了这个后门。

      由于JEP 245 JDK 9 改进了命令行参数验证,因此ThreadPriorityPolicy 不再接受0 或1 以外的值。

      如何解决

      编辑%CASSANDRA_HOME%/conf/jvm.options文件:

      • 如果您在 Linux 上以 root 运行 Cassandra,
        -XX:ThreadPriorityPolicy=42 替换为-XX:ThreadPriorityPolicy=1
      • 否则完全删除-XX:ThreadPriorityPolicy=42 行。

      【讨论】:

        【解决方案3】:

        如果没有 $CASSANDRA_HOME 设置,因为它不是源安装,那么它可能在 /usr/local/etc/cassandra

        janani@janani-C02Z78CMLVDQ fievel % find / -name jvm.options
        find: /usr/sbin/authserver: Permission denied
        /usr/local/etc/cassandra/jvm.options
        

        在我的本地,它不在 cassandra 安装路径下。

        janani@janani-C02Z78CMLVDQ fievel % brew --prefix cassandra
        /usr/local/opt/cassandra
        janani@janani-C02Z78CMLVDQ fievel % ls /usr/local/opt/cassandra
        CHANGES.txt         LICENSE.txt         NOTICE.txt          homebrew.mxcl.cassandra.plist   share
        INSTALL_RECEIPT.json        NEWS.txt            bin             libexec
        janani@janani-C02Z78CMLVDQ fievel % find /usr/local/opt/cassandra -name jvm.options
        janani@janani-C02Z78CMLVDQ fievel % 
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-03-05
          • 2019-11-12
          • 1970-01-01
          • 1970-01-01
          • 2015-04-18
          • 2013-05-25
          • 1970-01-01
          相关资源
          最近更新 更多