performance - Jasypt - 在 Solaris 上性能不佳
问题描述
我正在使用 PooledPBEStringEncryptor 来解密一些字符串。我正在多个线程上运行我的测试。
我在多个线程上执行下面的方法
public static long decryptJasypt (String str)
{
long time = System.currentTimeMillis();
encryptor.decrypt(str);
return System.currentTimeMillis()-time;
}
在哪里
encryptor = new PooledPBEStringEncryptor();
encryptor.setPoolSize(4);
我在 Ubuntu 和 Solaris 上运行相同的测试。在 Solaris 上完成相同的测试需要多 10 年的时间。
对于 Solaris,作为安全提供程序,我使用了
sun.security.pkcs11.SunPKCS11 ${java.home}/lib/security/sunpkcs11-solaris.cfg
或者
com.oracle.security.ucrypto.UcryptoProvider ${java.home}/lib/security/ucrypto-solaris.cfg
对于第一个提供者,我的线程留在这里:
"Thread-86" #104 prio=5 os_prio=64 tid=0x00000000014ab800 nid=0x78 runnable [0xffff80ffb3971000]
java.lang.Thread.State: RUNNABLE
at sun.security.pkcs11.wrapper.PKCS11.C_CloseSession(Native Method)
at sun.security.pkcs11.SessionRef.dispose(Session.java:171)
at sun.security.pkcs11.Session.close(Session.java:120)
at sun.security.pkcs11.SessionManager.closeSession(SessionManager.java:232)
at sun.security.pkcs11.SessionManager.killSession(SessionManager.java:174)
at sun.security.pkcs11.Token.killSession(Token.java:311)
at sun.security.pkcs11.P11Digest.engineReset(P11Digest.java:144)
at sun.security.pkcs11.P11Digest.engineDigest(P11Digest.java:194)
at sun.security.pkcs11.P11Digest.engineDigest(P11Digest.java:157)
at java.security.MessageDigest$Delegate.engineDigest(MessageDigest.java:592)
at java.security.MessageDigest.digest(MessageDigest.java:365)
at com.sun.crypto.provider.PBES1Core.deriveCipherKey(PBES1Core.java:279)
at com.sun.crypto.provider.PBES1Core.init(PBES1Core.java:250)
at com.sun.crypto.provider.PBEWithMD5AndDESCipher.engineInit(PBEWithMD5AndDESCipher.java:221)
而这里的另一个:
Thread-73" #91 prio=5 os_prio=64 tid=0x0000000001733800 nid=0x6b runnable [0xffff80ffb467e000]
java.lang.Thread.State: RUNNABLE
at com.oracle.security.ucrypto.NativeDigest.nativeInit(Native Method)
at com.oracle.security.ucrypto.NativeDigest.engineUpdate(NativeDigest.java:167)
- locked <0x00000003402108d0> (a com.oracle.security.ucrypto.NativeDigest$MD5)
at java.security.MessageDigest$Delegate.engineUpdate(MessageDigest.java:584)
at java.security.MessageDigest.update(MessageDigest.java:335)
at com.sun.crypto.provider.PBES1Core.deriveCipherKey(PBES1Core.java:278)
at com.sun.crypto.provider.PBES1Core.init(PBES1Core.java:250)
at com.sun.crypto.provider.PBEWithMD5AndDESCipher.engineInit(PBEWithMD5AndDESCipher.java:221)
at javax.crypto.Cipher.init(Cipher.java:1393)
at javax.crypto.Cipher.init(Cipher.java:1326)
您能否就我应该如何解决这个问题提出建议。在 Solaris 上运行的 jasypt 是否存在任何已知问题?
我的测试包括创建一个数组,其中包含一些用 jasypt 加密的简单字符串(其中包含 30 个项目),然后启动 100 个线程。每个线程将数组中的项目解密 10 次。
Solaris 上的结果:一个线程需要 39 到 79 秒才能完成此任务
Linux 上的结果:一个线程需要 2 到 7 秒才能完成此任务
在 linux 机器上:1 个物理处理器,8 个内核
在 solaris 上,我有一个虚拟机,它驻留在具有 2 个物理处理器的机器上,每个物理处理器具有 4 个内核和 8 个虚拟处理器。
注意:即使在具有 256 个内核的 solaris sparc 上解密数据时,我们也遇到了缓慢的问题。我无法在那个环境中执行我的测试。
public static ArrayList<String> ar = new ArrayList();
public static PooledPBEStringEncryptor encryptor;
static
{
Provider[] providers = Security.getProviders();
encryptor = new PooledPBEStringEncryptor();
encryptor.setPoolSize(4);
encryptor.setPassword("xxxxxx");
for (int i=0;i<10;i++){
ar.add(encryptJasyptValue("false"));
}
for (int i=0;i<10;i++){
ar.add(encryptJasyptValue(""+i));
}
for (int i=0;i<10;i++){
ar.add(encryptJasyptValue("true"));
}
}
public static long encryptJasypt (String str){
long time = System.currentTimeMillis();
return System.currentTimeMillis()-time;
}
public static long decryptJasypt (String str){
long time = System.currentTimeMillis();
encryptor.decrypt(str);
return System.currentTimeMillis()-time;
}
public static void main(String[] args) throws Exception
{
int noTreads =100;
if(args.length>0 && args[0]!=null) {
noTreads = Integer.parseInt(args[0]);
}
for (int i=0;i<noTreads;i++)
{
new MyThread().start();
}
}
}
class MyThread extends Thread {
public void run() {
long time=0;
for (int k=0;k<10;k++) {
for (int i = 0; i < CryptoUtil.ar.size(); i++) {
time += CryptoUtil.decryptJasypt(CryptoUtil.ar.get(i));
}
}
System.out.println("took d="+time);
}
}
解决方案
推荐阅读
- php - 如何解析类似于 .ini 文件的格式化文本?
- java - 生成二维码后如何保存名称
- python - 如何使用 pandas 和 python 从网站中提取和保存特定选项卡中显示的表格?
- javascript - 你如何让眼睛移动并跟随光标?老实说,我不知道从这里做什么
- r - 查找数据中的突然斜率
- react-native - 如何在反应本机屏幕上“锁定”组件的位置?
- java - Firestore 中的 WhereNotEqualTo 不起作用,但 whereEqualTo 起作用
- python - 合并多个 Pandas Dataframe 对象
- excel - Excel 中的范围与 Google 表格中的范围
- xamarin - 为什么在尝试将 Xamarin 应用程序部署到本地 iPhone 时突然出现“运行热重启时出错”?