Jay*_*han 2 java multithreading jvm cassandra
当我尝试启动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.
Run Code Online (Sandbox Code Playgroud)
其他信息
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)
Run Code Online (Sandbox Code Playgroud)
这是Cassandra的一个已知问题 - CASSANDRA-13107.
在Java 9 JVM接受任何整数值之前ThreadPriorityPolicy,0和1是唯一有效的值.
ThreadPriorityPolicy=1允许引发线程优先级,但仅当进程以root特权启动时才允许.何时ThreadPriorityPolicy=1,JVM明确检查 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;
}
}
Run Code Online (Sandbox Code Playgroud)
请注意上面代码中的错误(或后门):如果设置ThreadPriorityPolicy为0或1之外的其他内容,euid将跳过检查,但仍允许应用程序使用高于正常的优先级.卡桑德拉使用这个后门.
由于JEP 245 JDK 9改进了命令行参数验证,因此ThreadPriorityPolicy不再接受0或1以外的值.
编辑%CASSANDRA_HOME%/conf/jvm.options文件:
root在Linux上运行Cassandra ,请-XX:ThreadPriorityPolicy=42为-XX:ThreadPriorityPolicy=1-XX:ThreadPriorityPolicy=42完全删除行.正如异常消息已经告诉您的那样,ThreadPriorityPolicy 必须介于 0 和 1 之间:
intx ThreadPriorityPolicy=42 超出允许范围 [0 ... 1 ]
你用过加特林吗?这可能会对您有所帮助:https://github.com/gadling/gadling/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 权限。